C n阶贝塞尔曲线?

C n阶贝塞尔曲线?,c,geometry,computational-geometry,bezier,curve,C,Geometry,Computational Geometry,Bezier,Curve,我已经成功地实现了二次和三次贝塞尔曲线。它们非常简单,因为我们有一个公式。现在,我想用一般化表示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

我已经成功地实现了二次和三次贝塞尔曲线。它们非常简单,因为我们有一个公式。现在,我想用一般化表示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);
}
以下是输出:

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

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

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

你公式中的总和

…从0到n运行,即对于n阶贝塞尔,需要n+1点

你有4个点,所以你画了一个三阶贝塞尔

代码中的错误如下所示:

for(int j = 0; (unsigned int)j < nbPoint; j++)
for(int j=0;(无符号int)j
应该是:

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

对于(int j=0;(unsigned int)j,由于浮点值很小,看起来您正在失去准确性。但是当
j
达到
nbPoint
p[j]
超出了点阵列的限制?是的-您需要添加第5个点来制作4阶贝塞尔。因此p的大小必须为nbPoint+1。是的,我现在明白了。谢谢。这是一个怎样的答案?这不提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-@DonaldDuck:这是简明扼要地回答了问题。理查德·英格利斯的答案更好,有这么多漂亮的图片和其他东西,但如果你读了答案的第一句话,你会发现它基本上和我的一样。@TonyK这没有回答任何问题。你只需重新表述问题陈述,即OP试图构建第四阶r贝塞尔曲线有四个点,但它不起作用,而你在这里只介绍了两个新词:“不”和“奇迹”。没有解释为什么它不起作用,或者为什么四个点不够,以及应该怎么做。
for(int j = 0; (unsigned int)j <= nbPoint; j++)