n阶Bezier曲线?

我已经设法实现了二次和三次贝塞尔曲线。因为我们有一个公式,所以非常简单。 现在我想用泛化表示一个n阶贝塞尔曲线:

在此处输入图像描述

哪里

在此处输入图像描述

在此处输入图像描述

我正在使用位图库来渲染输出,所以这是我的代码:

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

这是要渲染的点集:

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

这是输出:

在此处输入图像描述

红色曲线是立方贝塞尔曲线。 蓝色的一个应该是四阶Bezier,它与立方Bezier相同,但在这种情况下,它们不一样?!

编辑:我忘了注意左下角是(0,0)

公式中的总和……

在此处输入图像描述

…从0到n运行,即对于n阶bezier,你需要n + 1个点。

你有4分,所以你正在绘制一个三阶贝塞尔。

代码中的错误在这里:

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

它应该是:

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

否则你只是从0迭代到n-1。

三阶贝塞尔

编辑:

出于兴趣,您获得的形状与缺失(第5)点位于(0,0)的情况相同,因为这是唯一对您的总和没有贡献的点...

4阶贝塞尔曲线,原点为第5点

您正尝试仅在四个点上构建四阶贝塞尔曲线。 难怪它不起作用。