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