n阶贝塞尔曲线是什么?

13

我已经成功实现了二次和三次贝塞尔曲线。由于有公式,它们相当直接。现在,我想使用泛化的方式表示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

红色曲线是三次贝塞尔曲线。蓝色曲线应该是四次贝塞尔曲线,与三次贝塞尔曲线相同,但在这种情况下,它们不相同?!

编辑: 我忘记注明左下角的点是(0, 0)


1
看起来你因为小的浮点数值而失去了精度。 - Yochai Timmer
2个回答

5

在您的公式中,求和范围为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迭代。 3阶贝塞尔曲线 编辑:
出于兴趣,您得到的形状与缺失的(第5个)点在(0,0)的形状相同,因为这是唯一一个对您的总和没有贡献的点... 第5个点在原点的4阶贝塞尔曲线

但是当 j 到达 nbPoint 时,p[j] 是否超出了 Point 数组的限制? - Jonas
是的 - 你需要添加第五个点来制作一个四阶贝塞尔曲线。因此,p的大小需要为nbPoint+1。 - Richard Inglis

4

你试图在仅有四个点的情况下构建一个四阶贝塞尔曲线,难怪它无法工作。


4
这怎么是一个回答? - Lo-Tan
1
这并没有提供问题的答案。如果要批评或请求作者澄清,请在他们的帖子下留言。-【来自审查】 - Donald Duck
@DonaldDuck: 这个回答简洁而正确。Richard Inglis的回答更好,有很多漂亮的图片和其他东西,但是如果你读那个答案的第一句话,你会发现它基本上和我的一样。 - TonyK
@TonyK 这并没有回答任何问题。你只是重新表述了问题陈述,即OP试图用四个点构建一个四阶贝塞尔曲线,但它不起作用,而你在这里只引入了两个新词:“没有”和“奇怪”。没有解释为什么不起作用,或者为什么四个点不足以完成任务,应该如何做才能成功。 - plasmacel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接