/* Mathematiques de l'informatique graphique */ /* Ligne polygonale 3D */ /* */ /* Auteur: Nicolas JANEY */ /* nicolas.janey@univ-fcomte.fr */ /* Mars 2014 */ #include #include #include #include #include #include "Position3D.h" #include "Vecteur4.h" #include "LignePolygonale3D.h" /* Constructeurs */ LignePolygonale3D::LignePolygonale3D(void) { n = 0; t = NULL; } LignePolygonale3D::LignePolygonale3D(int n) { this->n = n; t = new Position3D[n](); } LignePolygonale3D::LignePolygonale3D(LignePolygonale3D *lp) { n = lp->n; t = new Position3D[n](); for ( int i = 0 ; i < n ; i++ ) { t[i].c[0] = lp->t[i].c[0]; t[i].c[1] = lp->t[i].c[1]; t[i].c[2] = lp->t[i].c[2]; t[i].c[3] = lp->t[i].c[3]; } } /* Destructeur */ LignePolygonale3D::~LignePolygonale3D(void) { if ( n != 0 ) { delete [] t; } } LignePolygonale3D::LignePolygonale3D(int n, Position3D *p1,Position3D *p2, Position3D *p3,Position3D *p4, MatriceDeBase *m) { this->n = n; this->t = new Position3D[n](); Vecteur4 vx(p1->c[0],p2->c[0],p3->c[0],p4->c[0]); Vecteur4 vy(p1->c[1],p2->c[1],p3->c[1],p4->c[1]); Vecteur4 vz(p1->c[2],p2->c[2],p3->c[2],p4->c[2]); m->produit(&vx); m->produit(&vy); m->produit(&vz); for ( int i = 0 ; i < n ; i++ ) { double t =(double) i/(n-1); double tt = t*t; double ttt = tt*t; this->t[i].c[0] = ttt*vx.c[0]+tt*vx.c[1]+t*vx.c[2]+vx.c[3]; this->t[i].c[1] = ttt*vy.c[0]+tt*vy.c[1]+t*vy.c[2]+vy.c[3]; this->t[i].c[2] = ttt*vz.c[0]+tt*vz.c[1]+t*vz.c[2]+vz.c[3]; } } LignePolygonale3D::LignePolygonale3D(int n, LignePolygonale3D *lp, MatriceDeBase *m) { this->n = n; this->t = new Position3D[n](); for ( int i = 0 ; i < n ; i++ ) { double pos =(double) ((lp->n-3)*i)/(n-1); int p =(int) pos; if ( p == lp->n-3 ) // Dernier sommet de lissage p--; Vecteur4 vx(lp->t[p].c[0],lp->t[p+1].c[0],lp->t[p+2].c[0],lp->t[p+3].c[0]); Vecteur4 vy(lp->t[p].c[1],lp->t[p+1].c[1],lp->t[p+2].c[1],lp->t[p+3].c[1]); Vecteur4 vz(lp->t[p].c[2],lp->t[p+1].c[2],lp->t[p+2].c[2],lp->t[p+3].c[2]); m->produit(&vx); m->produit(&vy); m->produit(&vz); double t = pos-p; double tt = t*t; double ttt = tt*t; this->t[i].c[0] = ttt*vx.c[0]+tt*vx.c[1]+t*vx.c[2]+vx.c[3]; this->t[i].c[1] = ttt*vy.c[0]+tt*vy.c[1]+t*vy.c[2]+vy.c[3]; this->t[i].c[2] = ttt*vz.c[0]+tt*vz.c[1]+t*vz.c[2]+vz.c[3]; } } void LignePolygonale3D::set(int pos,Position3D *p) { t[pos].c[0] = p->c[0]; t[pos].c[1] = p->c[1]; t[pos].c[2] = p->c[2]; t[pos].c[3] = p->c[3]; } void LignePolygonale3D::print(void) { printf("%d\n",n); for ( int i = 0 ; i < n ; i++ ) { t[i].print(); printf("\n"); } } void LignePolygonale3D::drawOpenGL(int mode) { switch (mode) { case 0 : glBegin(GL_POINTS); for ( int i = 0 ; i < n ; i++ ) { glVertex3f(t[i].c[0],t[i].c[1],t[i].c[2]); } glEnd(); break; case 1 : glBegin(GL_LINE_STRIP); for ( int i = 0 ; i < n ; i++ ) { glVertex3f(t[i].c[0],t[i].c[1],t[i].c[2]); } glEnd(); break; } }