///
/// \file Direction3D.h
/// Mathematiques de l'informatique graphique: Direction 3D
/// 
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///

#ifndef ____DIRECTION3D____
#define ____DIRECTION3D____

class Position3D;

#include "CoordonneesHomogenes3D.h"

///
/// \class Direction3D
/// Mathematiques de l'informatique graphique: Direction 3D
/// 
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///

class Direction3D : public CoordonneesHomogenes3D {

  public :

///
/// Constructeur sans parametre.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    Direction3D(void);

///
/// Constructeur avec parametres.
///
/// @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
///
    Direction3D(double x,double y,double z);

///
/// Constructeur par clonage.
///
/// @param c La Direction3D a cloner.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    Direction3D(Direction3D *c);

///
/// Constructeur par calcul de la direction define par 2 positions.
///
/// @param p1 La Position3D initiale.
/// @param p2 La Position3D finale.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    Direction3D(Position3D *p1,Position3D *p2);

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

///
/// 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.
///
/// @return La norme.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    double normalisation(void);

///
/// Calcul du produit scalaire.
///
/// @param d La Direction3D avec laquelle calculer le produit scalaire.
/// @return Le produit scalaire.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    double produitScalaire(Direction3D *d);

///
/// Calcul du produit vectoriel de 2 Direction3D et affectation a this.
///
/// @param d1 La premiere Direction3D.
/// @param d2 La seconde Direction3D.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    void produitVectoriel(Direction3D *d1,Direction3D *d2);

///
/// Calcul du produit vectoriel de this et d'une Direction3D et affectation a this.
///
/// @param d La Direction3D.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    void produitVectoriel(Direction3D *d);
};

#endif
