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