割り当てとして、ベジェ曲線を描くためにDe Casteljauアルゴリズムを実装する必要があります。私はこのアルゴリズムがどのように機能するのか、それがどのように曲線を生成するのかを完全に理解していますが、私はアルゴリズムのコード化された実装について理解していません。この実装では、曲線を描くために制御点はどのように参照されますか?
assigmentは、3つの部分からなる:
制御点の一部の数だけでなく、それらを接続するエッジを描きます。
De Casteljauアルゴリズムと、このパラメータに従ってDe Casteljau線とベジェ点をすべて描画する[0、1]の範囲の指定されたパラメータ
t
に対してDe Casteljauアルゴリズムを実装します。これはt = 0.0
からt = 1.0
に反復し、drawDeCasteljau
に各t
を通過し、各ベジェ点を塗装することにより曲線を描きdrawDeCasteljau
呼び出された関数で行われます。これは
drawBezierCurve
プログラムは、その後、次のように動作するという関数で行われます。ポイントと、この新しいポイントまでの最後の点からエッジを追加する
- クリック
- ポイントをクリックしたままにしてドラッグすると、
t
が増加または減少します。 +
または-
を押します。- 押し
1
を押し2
は曲線全体
我々がされているサンプルアルゴリズムをペイントするt
int numPoints = 3;
Point bezPoints[numPoints][numPoints];
void DrawBezier() {
for (float u = 0.0; u <= 1.0; u += 0.01) {
for (int diag = numPoints - 2; diasg >= 0; diag--) {
for (int i = 0; i <= diag; i++) {
int j = diag - i;
bezPoints[i][j] = (1.0 - u)*bezPoints[i][j + 1] + u*bezPoints[i + 1][j];
}
}
setPixel(bezPoints[0][0]);
}
}
Iを完全bezPoints
マトリックスおよびアルゴリズム内の任意の制御点/線を基準の欠如と失わい。
bezPoints
はすでにDrawBezier()
が実行される前にポイントで埋めなければなりませんか?
コントロールポイントが3つある場合、bezPoints
は3x3マトリックスになるのはなぜですか?これらの9ポイントは正確には何に保存されていますか?
コントロールポイント/ラインを参照しなくてもアルゴリズムはどのように機能しますか?
EDIT以下ニコの助けに
おかげで、私はベジェ曲線を描くために管理している:
しかし、私はまだで、上記のステップ2を完了する方法を理解するのに苦労していますt
の現在の値のベジェ点を見つけるために使用されるDe Casteljau線のそれぞれを描画するために使用します。
問題のアルゴリズムが実行される前に、この対角線にコントロールポイントを手動で埋め込む必要がありますか?おそらく、 'bezPoints'と' DrawBezier'を宣言している行の間に、この対角線とコントロールポイントを反復して、対角の各要素の各点を参照するループがありますか? – KOB
さて、あなたの説明は私に各ベジェ・ポイントを取得する方法と、カーブ全体を描く方法を理解するのを許してくれました。上記のパーツ1と2は完成していませんが、ベジェ点を見つけるために個々の線分を描画する方法を理解するのには苦労しています。言い換えれば、この画像の赤とイエローの線を描く方法:http://www.e-cartouche.ch/content_reg/cartouche/graphics/en/image/casteljau/casteljau5.jpg – KOB
黒い線がコントロールです最も外側の対角線上の点から形成される。赤い線は、次の対角線上の点(「D = 1」)などによって形成されます。ピクチャは次数3のカーブを示しますが、コードでは次数2のカーブが生成されます(3つの制御ポイントがあります)。 –