13

二次および三次ベジェ曲線を実装することができました。数式があるため、これらは非常に簡単です。ここで、一般化を使用して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);
}

レンダリングするポイントのセットは次のとおりです。

Point ncurv[] = {
                    20, 200,
                    70, 300,
                    200, 400,
                    250, 200
                };

出力は次のとおりです。

ここに画像の説明を入力してください

赤い曲線は3次ベジェです。青いものは4次ベジェであるはずです。これは立方体のベジェと同じですが、この場合、それらは同じではありませんか?!

編集: 左下の点が(0、0)であることに注意するのを忘れました

4

2 に答える 2

5

数式の合計...

ここに画像の説明を入力してください

... 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までしか反復していません。

3次ベジェ

編集:

興味深いことに、得られた形状は、欠落している(5番目の)ポイントが(0,0)にある場合と同じです。これは、合計に何も寄与しない唯一のポイントだからです...

原点に5番目の点がある4次ベジェ

于 2013-03-24T15:49:39.713 に答える
4

4点のみで4次ベジェ曲線を作成しようとしています。それが機能していないのも不思議ではありません。

于 2013-03-24T14:54:55.527 に答える