L'exécutable

 

Fichier source : Bezier.cpp

Fichier source : LignePolygonale3D.h

/* Mathematiques de l'informatique graphique    */
/* Ligne polygonale en 3D                       */
/*                                              */
/* Auteur: Nicolas JANEY                        */
/* nicolas.janey@univ-fcomte.fr                 */
/* Novembre 2012                                */

#ifndef ____LIGNEPOLYGONALE3D____
#define ____LIGNEPOLYGONALE3D____

class Position3D;

class LignePolygonale3D  {

  public :
    int n;
    Position3D **t;

  private :
    int l;

  public :
    enum type_lissage {
      BEZIER = 1,
      BSPLINE_NRU = 2,
      BSPLINE_CATMULL_ROM = 3 };

  public :

    /* Constructeurs                            */
    LignePolygonale3D(void);
    LignePolygonale3D(int n);
    LignePolygonale3D(LignePolygonale3D *lp);
    LignePolygonale3D(LignePolygonale3D *lp,int np);
    LignePolygonale3D(LignePolygonale3D *lp,int np,type_lissage type);

    /* Destructeur                              */
    ~LignePolygonale3D(void);

    /* Ajout d'une Position3D                   */
    void add(Position3D *p);

    /* Dessin OpenGL                            */
    void draw(void);

  private :

    /* Allocation avec np Position3D            */
    /* disponibles                              */
    void init(int np);
};

#endif

Fichier source : LignePolygonale3D.cpp

/* Fonction factorielle                         */

static double factoriel(int n) {
  double fact = 1.0;
  for ( int i = 2 ; i <= n ; i++ ) {
    fact *= i; }
  return(fact);
}

/* Fonction de calcul des Cin                   */

static double *calculCinVersion1(int n) {
  double *cn =(double *) calloc(n,sizeof(double));
  cn[0] = cn[n-1] = 1.0;
  cn[1] = cn[n-2] = (double) (n-1);
  double factn = factoriel(n-1);
  for ( int i = 2 ; i < n-2 ; i++ ) {
    cn[i] = factn/(factoriel(i)*factoriel(n-i-1)); }
  return(cn);
}

/* Fonction de calcul des Cin                   */

static double *calculCinVersion2(int n) {
  double *cn =(double *) calloc(n,sizeof(double));
  cn[0] = cn[n-1] = 1.0;
  cn[1] = cn[n-2] = (double) (n-1);
  for ( int i = 2 ; i < n-2 ; i++ ) {
    cn[i] = (cn[i-1]*(n-i))/i; }
  return(cn);
}

/* Fonction power                               */

static double power(double v,int p) {
  return(( !v && !p ) ? 1.: pow(v,(double) p));
}

/* Construction d'une courbe de Bezier          */

static void construitBezier(Position3D **tp,int ntp,Position3D **tcb,int ntcb) {
  double *cn = calculCinVersion1(ntp);
  for ( int i = 0 ; i < ntcb ; i++ ) {
    double t =(double) i/(ntcb-1);
    double mt = 1.0-t;
    double x = 0.0,y = 0.0,z = 0.0;
    for ( int j = 0 ; j < ntp ; j++ ) {
      double fac = cn[j]*power(t,j)*power(mt,ntp-1-j);
      x += (fac*tp[j]->c[0]);
      y += (fac*tp[j]->c[1]);
      z += (fac*tp[j]->c[2]); }
    tcb[i]->c[0] = x;
    tcb[i]->c[1] = y;
    tcb[i]->c[2] = z; }
  free(cn);
}

/* Constructeur de creation de courbes lissees  */

LignePolygonale3D::LignePolygonale3D(LignePolygonale3D *lp,int np) {
  init(np);
  construitBezier(lp->t,lp->n,t,np);
}

RETOUR