20

ベジエ曲線を実装したいと思います。以前に C# でこれを行ったことがありますが、C++ ライブラリにはまったく慣れていません。二次曲線を作成するにはどうすればよいですか?

void printQuadCurve(float delta, Vector2f p0, Vector2f p1, Vector2f p2);

明らかに線形補間を使用する必要がありますが、これは標準の数学ライブラリに存在しますか? そうでない場合、どこで見つけることができますか?

私はLinuxを使用しています。

4

8 に答える 8

121

最近、同じ質問に出くわし、自分で実装したいと思いました。ウィキペディアからのこの画像は私を助けました:

http://upload.wikimedia.org/wikipedia/commons/3/35/Bezier_quadratic_anim.gif

次のコードは C++ で記述されており、2 次ベジエを計算する方法を示しています。

int getPt( int n1 , int n2 , float perc )
{
    int diff = n2 - n1;

    return n1 + ( diff * perc );
}    

for( float i = 0 ; i < 1 ; i += 0.01 )
{
    // The Green Line
    xa = getPt( x1 , x2 , i );
    ya = getPt( y1 , y2 , i );
    xb = getPt( x2 , x3 , i );
    yb = getPt( y2 , y3 , i );

    // The Black Dot
    x = getPt( xa , xb , i );
    y = getPt( ya , yb , i );

    drawPixel( x , y , COLOR_RED );
}

(x1|y1)、(x2|y2)、および (x3|y3) は、画像の P0、P1、および P2 です。基本的な考え方を示すためだけに...

3次ベジエを求める人にとっては、アナログで機能します(これもウィキペディアから):

http://upload.wikimedia.org/wikipedia/commons/a/a3/Bezier_cubic_anim.gif

この回答は、コードを提供します。

于 2012-07-11T14:45:40.050 に答える
15

これは、任意の数のポイントを持つ曲線の一般的な実装です。

vec2 getBezierPoint( vec2* points, int numPoints, float t ) {
    vec2* tmp = new vec2[numPoints];
    memcpy(tmp, points, numPoints * sizeof(vec2));
    int i = numPoints - 1;
    while (i > 0) {
        for (int k = 0; k < i; k++)
            tmp[k] = tmp[k] + t * ( tmp[k+1] - tmp[k] );
        i--;
    }
    vec2 answer = tmp[0];
    delete[] tmp;
    return answer;
}

それほど効率的ではない一時配列にヒープメモリを使用することに注意してください。固定数のポイントのみを処理する必要がある場合は、numPoints 値をハードコーディングして、代わりにスタック メモリを使用できます。

もちろん、上記は、次のような vec2 構造体とその演算子があることを前提としています。

struct vec2 {
    float x, y;
    vec2(float x, float y) : x(x), y(y) {}
};

vec2 operator + (vec2 a, vec2 b) {
    return vec2(a.x + b.x, a.y + b.y);
}

vec2 operator - (vec2 a, vec2 b) {
    return vec2(a.x - b.x, a.y - b.y);
}

vec2 operator * (float s, vec2 a) {
    return vec2(s * a.x, s * a.y);
}
于 2014-02-08T06:45:32.343 に答える
13

上記で説明したように、線形補間を使用してポイントに到達するまで制御パスを再帰的に分割する de Casteljau の方法か、制御点をブレンドする Bezier の方法のいずれかを選択できます。

ベジェ法は

 p = (1-t)^3 *P0 + 3*t*(1-t)^2*P1 + 3*t^2*(1-t)*P2 + t^3*P3 

立方体と

 p = (1-t)^2 *P0 + 2*(1-t)*t*P1 + t*t*P2

二次方程式の場合。

t は通常 0 ~ 1 ですが、これは必須ではありません。実際、曲線は無限に伸びます。P0、P1 などは制御点です。曲線は 2 つの終点を通過しますが、通常は他の点を通過しません。

于 2017-03-28T14:01:04.050 に答える
8

以前に C# ライブラリを使用しましたか?

C++ では、ベジエ曲線の標準ライブラリ関数は (まだ) 利用できません。もちろん、独自のもの (CodeProjectサンプル) を作成したり、数学ライブラリを探したりすることもできます。

このブログ投稿では、アイデアをうまく​​説明していますが、Actionscript で説明しています。翻訳はそれほど問題にはなりません。

于 2009-04-24T09:20:39.887 に答える
1
于 2009-04-24T09:33:22.260 に答える