ベジエ曲線を実装したいと思います。以前に C# でこれを行ったことがありますが、C++ ライブラリにはまったく慣れていません。二次曲線を作成するにはどうすればよいですか?
void printQuadCurve(float delta, Vector2f p0, Vector2f p1, Vector2f p2);
明らかに線形補間を使用する必要がありますが、これは標準の数学ライブラリに存在しますか? そうでない場合、どこで見つけることができますか?
私はLinuxを使用しています。
ベジエ曲線を実装したいと思います。以前に C# でこれを行ったことがありますが、C++ ライブラリにはまったく慣れていません。二次曲線を作成するにはどうすればよいですか?
void printQuadCurve(float delta, Vector2f p0, Vector2f p1, Vector2f p2);
明らかに線形補間を使用する必要がありますが、これは標準の数学ライブラリに存在しますか? そうでない場合、どこで見つけることができますか?
私はLinuxを使用しています。
最近、同じ質問に出くわし、自分で実装したいと思いました。ウィキペディアからのこの画像は私を助けました:
次のコードは 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次ベジエを求める人にとっては、アナログで機能します(これもウィキペディアから):
この回答は、コードを提供します。
これは、任意の数のポイントを持つ曲線の一般的な実装です。
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);
}
上記で説明したように、線形補間を使用してポイントに到達するまで制御パスを再帰的に分割する 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 つの終点を通過しますが、通常は他の点を通過しません。
ベジエ曲線を表示したいだけなら、PolyBezier for Windows のようなものを使用できます。
ルーチンを自分で実装したい場合は、Intarnetz のいたるところで線形補間コードを見つけることができます。
Boost ライブラリはこれをサポートしていると思います。特にベジエではなく、線形補間。ただし、これについて私を引用しないでください。