 
     
     
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);
    }