///
/// \file coordonn.h
/// Structures et fonctions pour la manipulation de coordonnees.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///

#ifndef ____COORDONNEES____
#define ____COORDONNEES____

#define ____FLOAT____

#ifdef ____FLOAT____
  #define __TYPE__ float
  #else
  #define __TYPE__ double
#endif
///
/// \def INFINIE
/// Valeur infinie positive reelle.
/// 
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
#define INFINIE  1e+10

///
/// \struct coord_2D
/// Structure de stockage de coordonnees 2D.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct coord_2D {
  double                    x;     ///< Coordonnee x.
  double                    y;     ///< Coordonnee y.
};

///
/// \struct coord_3D
/// Structure de stockage de coordonnees 3D.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct coord_3D {
  #ifdef ____FLOAT____
  float                    x;     ///< Coordonnee x.
  float                    y;     ///< Coordonnee y.
  float                    z;     ///< Coordonnee z.
  #else
  double                   x;     ///< Coordonnee x.
  double                   y;     ///< Coordonnee y.
  double                   z;     ///< Coordonnee z.
  #endif
};

///
/// \struct coord_2D_court
/// Structure de stockage de coordonnees 2D.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct coord_2D_court {
  float                     x;     ///< Coordonnee x.
  float                     y;     ///< Coordonnee x.
};

///
/// \struct vect_3D_origine
/// Structure de stockage d'un vecteur a l'origine.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct vect_3D_origine {
  double                    dx;     ///< Coordonnee dx.
  double                    dy;     ///< Coordonnee dy.
  double                    dz;     ///< Coordonnee dz.
};

///
/// \struct coord_4D
/// Structure de stockage de coordonnees 3D en coodonnees homogenes.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct coord_4D {
  double                    x;     ///< Coordonnee x.
  double                    y;     ///< Coordonnee y.
  double                    z;     ///< Coordonnee z.
  double                    t;     ///< Coordonnee homogene supplementaire.
};

///
/// \struct coordonnees_2D
/// Structure de stockage de coordonnees 2D.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct coordonnees_2D {
  int                       x;     ///< Coordonnee x.
  int                       y;     ///< Coordonnee y.
};

///
/// \struct coordonnees_3D
/// Structure de stockage de coordonnees 3D.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct coordonnees_3D {
  int                       x;     ///< Coordonnee x.
  int                       y;     ///< Coordonnee y.
  int                       z;     ///< Coordonnee z.
};

///
/// \struct coord_3D_court
/// Structure de stockage de coordonnees 3D.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct coord_3D_court {
  float                     x;     ///< Coordonnee x.
  float                     y;     ///< Coordonnee y.
  float                     z;     ///< Coordonnee z.
};

///
/// \struct coordonnees_3D_long
/// Structure de stockage de coordonnees 3D.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct coordonnees_3D_long {
  long                      x;     ///< Coordonnee x.
  long                      y;     ///< Coordonnee y.
  long                      z;     ///< Coordonnee z.
};

///
/// \struct coord_4D_double
/// Structure de stockage de coordonnees 3D en coodonnees homogenes.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct coord_4D_double {
  double                    x;     ///< Coordonnee x.
  double                    y;     ///< Coordonnee y.
  double                    z;     ///< Coordonnee z.
  double                    t;     ///< Coordonnee t.
};

///
/// \struct translation
/// Structure de stockage d'une translation.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct translation {
  double                    tx;     ///< Deplacement en x.
  double                    ty;     ///< Deplacement en y.
  double                    tz;     ///< Deplacement en z.
};

///
/// \struct orientation
/// Structure de stockage d'une orientation.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct orientation {
  double                    rx;     ///< Rotation en x.
  double                    ry;     ///< Rotation en y.
  double                    rz;     ///< Rotation en z.
};

///
/// \struct affinite
/// Structure de stockage d'une affinite.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct affinite {
  double                    ax;     ///< Zoom en x.
  double                    ay;     ///< Zoom en y.
  double                    az;     ///< Zoom en z.
};

///
/// \struct arcs
/// Structure de stockage d'un arc.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct arcs {
  double                    deb;     ///< Angle initial.
  double                    fin;     ///< Angle final.
};

///
/// \union coord_3D_homogenes
/// Union de stockage de coordonnees homogenes 3D.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
union coord_3D_homogenes {
  double                    ct[4];   ///< Tableau des composantes.
  struct coord_4D_double    co;      ///< Structure.
};

///
/// \union coord_3D_hmg
/// Union de stockage de coordonnees homogenes 3D.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
union coord_3D_hmg {
  double                    ct[4];   ///< Tableau des composantes.
  struct coord_4D           co;      ///< Structure.
};

///
/// \union transformation
/// Structure de stockage d'une transformation geometrique.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
union transformation {
  double                    tt[16];      ///< Tableau des composantes.
  double                    ttt[4][4];   ///< Matrice des composantes.
  union coord_3D_homogenes  to[4];       ///< Tableau des structures.
};

///
/// \union transform
/// Structure de stockage d'une transformation geometrique.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
union transform {
  double                    tt[16];      ///< Tableau des composantes.
  double                    ttt[4][4];   ///< Matrice des composantes.
  union coord_3D_hmg        to[4];       ///< Tableau des structures.
};

///
/// \struct fenetre
/// Structure de stockage d'une fenetre.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct fenetre {
  int                       xi;      ///< Coordonnee x du premier coin.
  int                       yi;      ///< Coordonnee y du premier coin.
  int                       xf;      ///< Coordonnee x du second coin.
  int                       yf;      ///< Coordonnee y du second coin.
};

///
/// \struct point_de_vue
/// Structure de stockage d'un point de vue.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
struct point_de_vue {
  union coord_3D_homogenes  pv;      ///< Coordonnees de la position du point de vue.
  struct orientation        pvor;    ///< Orientation du point de vue.
};

///
/// \var coord_4D
/// Typedef de stockage de coordonnees 3D en coodonnees homogenes.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
typedef struct coord_4D coord_4D;
typedef struct coord_3D coord_3D;
typedef struct coord_3D_court coord_3D_court;

///
/// Test d'egalite entre deux coord_4D.
///
/// @param c1 La premiere coord_4D.
/// @param c2 La seconde coord_4D.
/// @return L'entier signifiant l'egalite ou non.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
int egal(coord_4D *c1,coord_4D *c2);

///
/// Normalisation d'une coord_4D.
///
/// @param v La coord_4D a normaliser.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
void normalise(coord_4D *v);

///
/// Calcul de la normale au plan forme par quatre coord_4D.
///
/// @param c1 La premiere coord_4D.
/// @param c2 La seconde coord_4D.
/// @param c3 La seconde coord_4D.
/// @param n La coord_4D de stockage de la normale.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
void normale(coord_4D *c1,coord_4D *c2,coord_4D *c3,coord_4D *n);

///
/// Test d'egalite entre deux coord_3D.
///
/// @param c1 La premiere coord_3D.
/// @param c2 La seconde coord_3D.
/// @return L'entier signifiant l'egalite ou non.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
int egal(coord_3D *c1,coord_3D *c2);

///
/// Normalisation d'une coord_3D.
///
/// @param v La coord_3D a normaliser.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
void normalise(coord_3D *v);

///
/// Calcul de la normale au plan forme par quatre coord_3D.
///
/// @param c1 La premiere coord_3D.
/// @param c2 La seconde coord_3D.
/// @param c3 La seconde coord_3D.
/// @param n La coord_3D de stockage de la normale.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
void normale(coord_3D *c1,coord_3D *c2,coord_3D *c3,coord_3D *n);

///
/// Test d'egalite entre deux coord_3D_court.
///
/// @param c1 La premiere coord_3D_court.
/// @param c2 La seconde coord_3D_court.
/// @return L'entier signifiant l'egalite ou non.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
int egal(coord_3D_court *c1,coord_3D_court *c2);

///
/// Normalisation d'une coord_3D_court.
///
/// @param v La coord_3D_court a normaliser.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
void normalise(coord_3D_court *v);

///
/// Calcul de la normale au plan forme par quatre coord_3D_court.
///
/// @param c1 La premiere coord_3D_court.
/// @param c2 La seconde coord_3D_court.
/// @param c3 La seconde coord_3D_court.
/// @param n La coord_3D_court de stockage de la normale.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
void normale(coord_3D_court *c1,coord_3D_court *c2,coord_3D_court *c3,coord_3D_court *n);

///
/// Calcul de la normale au plan forme par quatre coord_3D_court.
///
/// @param c1 La premiere coord_3D_court.
/// @param c2 La seconde coord_3D_court.
/// @param c3 La seconde coord_3D_court.
/// @param n La coord_3D de stockage de la normale.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
void normale(coord_3D_court *c1,coord_3D_court *c2,coord_3D_court *c3,coord_3D *n);

#endif
