L'exécutable

Une B-Spline sur 4 sommets de contrôle

Une B-Spline par morceaux

Fichier source : B-Spline.cpp

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

RETOUR