/**
 * \file Vecte3DD.h
 * Classe de modelisation de directions dans un espace 3 dimensions.
 * 
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */

#ifndef ____VECTE3DD____
#define ____VECTE3DD____

class MatriceD;
class Coord3DD;

class Vecte3DD {
  public :
    double x;     /**< Coordonnee x. */
    double y;     /**< Coordonnee y. */
    double z;     /**< Coordonnee z. */
    double t;     /**< Coordonnee t. */

  public :

/**
 * Constructeur: Vecteur nul.
 *
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    Vecte3DD(void);

/**
 * Constructeur: Vecteur entre 2 Coord3DD.
 *
 * @param p1 Le premier Coord3DD.
 * @param p2 Le second Coord3DD.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    Vecte3DD(Coord3DD *p1,Coord3DD *p2);

/**
 * Constructeur: Vecteur (x,y,z).
 *
 * @param x La coordonnee x.
 * @param y La coordonnee y.
 * @param z La coordonnee z.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    Vecte3DD(double x,double y,double z);

/**
 * Constructeur: Le Vecte3DD a copier.
 *
 * @param a Le Vecte3DD a copier.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    Vecte3DD(Vecte3DD *a);

/**
 * Destructeur.
 *
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    ~Vecte3DD(void);

/**
 * Affectation de this avec les vecteur defini par deux Coord3DD.
 *
 * @param p1 Le premier Coord3DD.
 * @param p2 Le second Coord3DD.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    void toVecteur(Coord3DD *p1,Coord3DD *p2);

/**
 * Calcul de la norme.
 *
 * @return La norme.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    double norme(void);

/**
 * Normalisation.
 *
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    void normalise(void);

/**
 * Calcul du produit scalaire avec un autre Vecte3DD.
 *
 * @param d L'autre Vecte3DD.
 * @return Le produit scalaire.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    double produitScalaire(Vecte3DD *d);

/**
 * Calcul du produit vectoriel avec un autre Vecte3DD et stockage dans un autre Vecte3DD.
 *
 * @param v L'autre Vecte3DD.
 * @param r Le Vecte3DD de stockage du resultat.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    void produitVectoriel(Vecte3DD *v,Vecte3DD *r);

/**
 * Calcul du produit vectoriel avec un autre Vecte3DD et stockage dans un Vecte3DD nouvellement instancie.
 *
 * @param v L'autre Vecte3DD.
 * @return Le produit vectoriel.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    Vecte3DD *newProduitVectoriel(Vecte3DD *v);

/**
 * Addition a this d'un autre Vecte3DD.
 *
 * @param v L'autre Vecte3DD.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    void addition(Vecte3DD *v);

/**
 * Addition de this et d'un autre Vecte3DD et stockage du resultat dans un Vecte3DD.
 *
 * @param v L'autre Vecte3DD.
 * @param r Le Vecte3DD de stockage du resultat.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    void addition(Vecte3DD *v,Vecte3DD *r);

/**
 * Addition de this et d'un autre Vecte3DD et stockage du resultat dans un Vecte3DD nouvellement instancie.
 *
 * @param v L'autre Vecte3DD.
 * @return Le Vected3DD somme.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    Vecte3DD *newAddition(Vecte3DD *v);

/**
 * Soustraction a this d'un autre Vecte3DD.
 *
 * @param v L'autre Vecte3DD.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    void soustraction(Vecte3DD *v);

/**
 * Soustraction de this et d'un autre Vecte3DD et stockage du resultat dans un Vecte3DD.
 *
 * @param v L'autre Vecte3DD.
 * @param r Le Vecte3DD de stockage du resultat.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    void soustraction(Vecte3DD *v,Vecte3DD *r);

/**
 * Soustraction de this et d'un autre Vecte3DD et stockage du resultat dans un Vecte3DD nouvellement instancie.
 *
 * @param v L'autre Vecte3DD.
 * @return Le Vected3DD somme.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    Vecte3DD *newSoustraction(Vecte3DD *v);

/**
 * Multiplication de this par un double et stockage du resultat dans this.
 *
 * @param f le double.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    void multiplication(double f);

/**
 * Multiplication de this et d'un double et stockage du resultat dans un Vecte3DD.
 *
 * @param f le double.
 * @param r Le Vecte3DD de stockage du resultat.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    void multiplication(double f,Vecte3DD *r);

/**
 * Multiplication de this par un double avec stockage dans un Vected3DD nouvellement instancie.
 *
 * @param f Le double.
 * @return Le Vected3DD produit.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    Vecte3DD *newMultiplication(double f);

/**
 * Produit d'une MatriceD par this avec stockage dans un Vected3DD nouvellement instancie.
 *
 * @param m La MatriceD de multiplication.
 * @return Le Vected3DD produit.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    Vecte3DD *newProduit(MatriceD *m);

/**
 * Produit d'une MatriceD par this avec stockage dans this.
 *
 * @param m La MatriceD de multiplication.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    void produit(MatriceD *m);

/**
 * Produit d'une MatriceD par this avec stockage dans un Vecte3DD.
 *
 * @param m La MatriceD de multiplication.
 * @param v Le Vecte3DD de stockage du resultat.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    void produit(MatriceD *m,Vecte3DD *v);
};

#endif
