Подтвердить что ты не робот

N-й порядок кривых Безье?

Мне удалось реализовать квадратичные и кубические кривые Безье. Они довольно просты, так как у нас есть формула. Теперь я хочу представить кривую Безье из n-го порядка, используя обобщение:

enter image description here

Где

enter image description here

и

enter image description here

Я использую библиотеку bitmap для вывода вывода, так что вот мой код:

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

4b9b3361

Ответ 1

Сумма в вашей формуле...

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

Ответ 2

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