/**
 * \file Vecte3D.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 ____VECTE3D____
#define ____VECTE3D____

class Matrice;
class Coord3D;

class Vecte3D {
  public :
    float x;     /**< Coordonnee x. */
    float y;     /**< Coordonnee y. */
    float z;     /**< Coordonnee z. */
    float t;     /**< Coordonnee t. */

  public :

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

/**
 * Constructeur: Vecteur entre 2 Coord3D.
 *
 * @param p1 Le premier Coord3D.
 * @param p2 Le second Coord3D.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    Vecte3D(Coord3D *p1,Coord3D *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
 */
    Vecte3D(float x,float y,float z);

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

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

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

/**
 * Calcul de la norme.
 *
 * @return La norme.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    float 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 Vecte3D.
 *
 * @param d L'autre Vecte3D.
 * @return Le produit scalaire.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    float produitScalaire(Vecte3D *d);

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

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

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

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

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

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

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

/**
 * Soustraction de this et d'un autre Vecte3D et stockage du resultat dans un Vecte3D nouvellement instancie.
 *
 * @param v L'autre Vecte3D.
 * @return Le Vected3DD somme.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    Vecte3D *newSoustraction(Vecte3D *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(float f);

/**
 * Multiplication de this et d'un double et stockage du resultat dans un Vecte3D.
 *
 * @param f le double.
 * @param r Le Vecte3D de stockage du resultat.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
    void multiplication(float f,Vecte3D *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
 */
    Vecte3D *newMultiplication(float f);

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

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

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

#endif
