Ordre de Bézier n-ième?

J’ai réussi à mettre en œuvre des courbes de Bézier quadratiques et cubiques. Elles sont assez simples car nous avons une formule. Maintenant, je veux représenter une courbe de Bézier du n-ième ordre en utilisant la généralisation:

entrez la description de l'image ici

entrez la description de l'image ici

et

entrez la description de l'image ici

J’utilise une bibliothèque bitmap pour restituer la sortie, voici donc mon code:

// binomialCoef(n, k) = (factorial(n) / (factorial(k) * factorial(n- k))) unsigned int binomialCoef(unsigned int n, const unsigned int k) { unsigned int r = 1; if(k > n) return 0; for(unsigned int d = 1; d <= k; d++) { r *= n--; r /= d; } return r; } void nBezierCurve(Bitmap* obj, const Point* p, const unsigned int nbPoint, float steps, const unsigned char red, const unsigned char green, const unsigned char blue) { int bx1 = p[0].x; int by1 = p[0].y; int bx2; int by2; steps = 1 / steps; for(float i = 0; i < 1; i += steps) { bx2 = by2 = 0; for(int j = 0; (unsigned int)j < nbPoint; j++) { bx2 += (int)(binomialCoef(nbPoint, j) * pow(1 - i, (float)nbPoint - j) * pow(i, j) * p[j].x); by2 += (int)(binomialCoef(nbPoint, j) * pow(1 - i, (float)nbPoint - j) * pow(i, j) * p[j].y); } bresenhamLine(obj, bx1, by1, bx2, by2, red, green, blue); bx1 = bx2; by1 = by2; } // curve must end on the last anchor point bresenhamLine(obj, bx1, by1, p[nbPoint - 1].x, p[nbPoint - 1].y, red, green, blue); } 

Voici l’ensemble des points à rendre:

 Point ncurv[] = { 20, 200, 70, 300, 200, 400, 250, 200 }; 

et voici la sortie:

entrez la description de l'image ici

La courbe rouge est un Bézier cubique. Le bleu est supposé être le 4ème ordre de Bézier, ce qui est identique au cubique Bézier, mais dans ce cas, ce ne sont pas les mêmes?!

EDIT: j’ai oublié de noter que le point en bas à gauche est (0, 0)

La sum dans votre formule …

entrez la description de l'image ici

… va de 0 à n, c’est-à-dire que pour un bezier du nième ordre, vous avez besoin de n + 1 points.

Vous avez 4 points, vous dessinez donc un bezier de troisième ordre.

L’erreur dans votre code est ici:

 for(int j = 0; (unsigned int)j < nbPoint; j++) 

CA devrait etre:

 for(int j = 0; (unsigned int)j <= nbPoint; j++) 

sinon, vous ne faites qu'itérer de 0 à n-1.

Bézier de 3ème ordre

MODIFIER:

Par intérêt, la forme que vous obteniez est la même que si le (5ème) point manquant était à (0,0), car c’est le seul point qui ne consortingbuerait en rien à votre sum ...

Bézier de 4ème ordre avec 5ème point à l'origine

Vous essayez de construire une courbe de Bézier du 4ème ordre sur quatre points seulement. Pas étonnant que ça ne marche pas.