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
/* 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]); }
}