2017-03-26 4 views
0

割り当てとして、ベジェ曲線を描くためにDe Casteljauアルゴリズムを実装する必要があります。私はこのアルゴリズムがどのように機能するのか、それがどのように曲線を生成するのかを完全に理解していますが、私はアルゴリズムのコード化された実装について理解していません。この実装では、曲線を描くために制御点はどのように参照されますか?

assigmentは、3つの部分からなる:

  1. 制御点の一部の数だけでなく、それらを接続するエッジを描きます。

  2. De Casteljauアルゴリズムと、このパラメータに従ってDe Casteljau線とベジェ点をすべて描画する[0、1]の範囲の指定されたパラメータtに対してDe Casteljauアルゴリズムを実装します。これはt = 0.0からt = 1.0に反復し、drawDeCasteljauに各tを通過し、各ベジェ点を塗装することにより曲線を描きdrawDeCasteljau

  3. 呼び出された関数で行われます。これは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以下ニコの助けに

    おかげで、私はベジェ曲線を描くために管理している:

    enter image description here

    しかし、私はまだで、上記のステップ2を完了する方法を理解するのに苦労していますtの現在の値のベジェ点を見つけるために使用されるDe Casteljau線のそれぞれを描画するために使用します。

  • 答えて

    0

    コントロールポイントは、行列bezPointsの最も遠い対角線にある必要があります。あなたはインデックス作成に慣れていなければなりません。 、diag以上のループは、他の対角線を埋める

    i \ j | 0 | 1 | 2 
    ------+---+---+--- 
        0 |   C 
        1 |  C 
        2 | C 
    

    アルゴリズムの1回の繰り返しを適用した後の中間点、すなわち:、あなたはnumPoints = 3を持っている場合は、コントロールポイントは、対角2である必要があり、すなわちbezPoints[0][2], bezPoints[1][1], bezPoints[2][0]:ここではそれがどのように動作するかです:

    i \ j | 0 | 1 | 2 
    ------+---+---+--- 
        0 |D=0 D=1 C 
        1 |D=1 C 
        2 | C 
    

    そして最後に、bezPoints[0][0]になります。

    変数uは、カーブパラメータを表します。

    +0

    問題のアルゴリズムが実行される前に、この対角線にコントロールポイントを手動で埋め込む必要がありますか?おそらく、 'bezPoints'と' DrawBezier'を宣言している行の間に、この対角線とコントロールポイントを反復して、対角の各要素の各点を参照するループがありますか? – KOB

    +0

    さて、あなたの説明は私に各ベジェ・ポイントを取得する方法と、カーブ全体を描く方法を理解するのを許してくれました。上記のパーツ1と2は完成していませんが、ベジェ点を見つけるために個々の線分を描画する方法を理解するのには苦労しています。言い換えれば、この画像の赤とイエローの線を描く方法:http://www.e-cartouche.ch/content_reg/cartouche/graphics/en/image/casteljau/casteljau5.​​jpg – KOB

    +0

    黒い線がコントロールです最も外側の対角線上の点から形成される。赤い線は、次の対角線上の点(「D = 1」)などによって形成されます。ピクチャは次数3のカーブを示しますが、コードでは次数2のカーブが生成されます(3つの制御ポイントがあります)。 –

    関連する問題