 Une B-Spline sur 4 sommets de contrôle
 Une B-Spline sur 4 sommets de contrôle
  Une B-Spline par morceaux
 Une B-Spline par morceaux
Fichier source : LignePolygonale3D.h
/* Mathematiques de l'informatique graphique    */
    /* Ligne polygonale 3D                          */
    /*                                              */
    /* Auteur: Nicolas JANEY                        */
    /* nicolas.janey@univ-fcomte.fr                 */
    /* Mars 2014                                    */
    
    #ifndef ____LIGNEPOLYGONALE3D____
    #define ____LIGNEPOLYGONALE3D____
    
    #include "Position3D.h"
    #include "MatriceDeBase.h"
    
    class LignePolygonale3D {
    
      public :
        int n;
        Position3D *t;
    
      public :
    
        /* Constructeurs                            */
        LignePolygonale3D(void);
        LignePolygonale3D(int n);
        LignePolygonale3D(LignePolygonale3D *lp);
        LignePolygonale3D(int n,Position3D *p1,Position3D *p2,Position3D *p3,Position3D *p4,MatriceDeBase *m);
        LignePolygonale3D(int n,LignePolygonale3D *lp,MatriceDeBase *m);
    
        /* Destructeur                              */
        ~LignePolygonale3D(void);
    
        void set(int pos,Position3D *p);
        void print(void);
        void drawOpenGL(int mode);
    };
    
    #endif
    
Fichier source : LignePolygonale3D.cpp
/* Mathematiques de l'informatique graphique    */
    /* Ligne polygonale 3D                          */
    /*                                              */
    /* Auteur: Nicolas JANEY                        */
    /* nicolas.janey@univ-fcomte.fr                 */
    /* Mars 2014                                    */
    
    #include <stdlib.h>
    #include <stdio.h>
    
    #include <GL/glut.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    
    #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; }
    }