L'exécutable


4 points de contrôle


Début et fin de la courbe B-Spline NRUBS calculée sur les 4 points de contrôle


Courbe B-Spline NRUBS complète


Courbe B-Spline par morceaux

Fichier source : B-Spline.cpp

/* Calcul la position d'un point sur une courbe  */
/* B-Spline controlee par quatre sommets         */
/* g : le tableau des 4 sommets de controle      */
/* t : la valeur de calcul du point              */
/*     t a prendre dans l'intervalle [0.0,1.0]   */
/* mb : la matrice de base                       */
/* p : le point resultat                         */

static void determinationPositionSurBSpline(Pos3D **g,double t,double mb[4][4],Pos3D *p) {
  double vt[4] = { t*t*t,t*t,t,1.0 };
  double vtmb[4] = { 0.0,0.0,0.0,0.0 };
  for ( int j = 0 ; j < 4 ; j++ ) {
    for ( int k = 0 ; k < 4 ; k++ )
      vtmb[j] += vt[k] * mb[k][j] ; }
  p->x = p->y = p->z = 0.0;
  for ( int j = 0 ; j < 4 ; j++ ) {
    p->x += vtmb[j] * g[j]->x ;
    p->y += vtmb[j] * g[j]->y ;
    p->z += vtmb[j] * g[j]->z ; }
}

/* Calcul les points definissant une courbe      */
/* B-Spline par morceaux definie par un ensemble */
/* de sommets de controle                        */
/* tPos : le tableau des sommets de controle     */
/* n : le nombre de sommets de contrôle          */
/* mb : la matrice de base                       */
/* nb : le nombre de points a calculer           */
/* tRes : le tableau de points resultat          */

static void calculBSpline(Pos3D **tPos,int n,double mb[4][4],int nb,Pos3D **tRes) {
  for ( int i = 0 ; i < nb ; i++ ) {
    double pos = i/(nb-1.0)*(n-3);
    int nb =(int) pos;
    if ( nb == n-3 )
      nb = n-4;
    double t = pos-nb;
    determinationPositionSurBSpline(&tPos[nb],t,mb,tRes[i]); }
}

RETOUR