кривые Безье n-го порядка?

мне удалось реализовать квадратичные и кубические кривые Безье.Они довольно просты, так как у нас есть формула. Теперь я хочу представить кривую Безье 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-го порядка, который совпадает с кубическим Безье, но в этом случае они не одинаковы ?!

EDIT: Я забыл отметить, что нижняя левая точка (0, 0)

2 ответов


сумма в Формуле...

enter image description here

...работает от 0 до n, т. е. для n-го порядка Безье нужно N+1 точек.

у вас есть 4 очка, поэтому вы рисуете Безье 3-го порядка.

ошибка в вашем коде здесь:

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

должно быть:

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

в противном случае вы только повторяете от 0 до n-1.

3rd-order bezier

EDIT:

из интереса, форма, которую вы получали это то же самое, как если бы отсутствующая (5-я) точка была на (0,0), так как это единственная точка, которая ничего не внесет в вашу сумму...

4th-order bezier with 5th point at origin


вы пытаетесь построить кривую Безье 4-го порядка только на четырех точках. Неудивительно, что он не работает.