gpt4 book ai didi

c - n阶贝塞尔曲线?

转载 作者:太空狗 更新时间:2023-10-29 16:38:54 25 4
gpt4 key购买 nike

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

enter image description here

在哪里

enter image description here

enter image description here

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

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

这是输出:

enter image description here

红色曲线是三次贝塞尔曲线。蓝色的应该是4阶贝塞尔曲线,和三次贝塞尔曲线一样,但是在这种情况下,它们不一样?!

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

最佳答案

公式中的总和...

enter image description here

...从 0 运行到 n,即对于第 n 阶贝塞尔曲线,您需要 n+1 个点。

您有 4 个点,因此您正在绘制三阶贝塞尔曲线。

您的代码中的错误在这里:

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

应该是:

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

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

3rd-order bezier

编辑:

出于兴趣,您得到的形状与缺失的(第 5 个)点位于 (0,0) 相同,因为这是唯一对您的求和没有任何贡献的点...

4th-order bezier with 5th point at origin

关于c - n阶贝塞尔曲线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15599766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com