2009-07-02 11 views
2

二次ベジエ曲線を補間するためにAS2でコードを取得したいと思います。ノードは互いから一定距離離れていることを意味する。基本的には、3ptで定義される非双曲線二次ベジェ曲線に沿って一定速度でボールをアニメーション化することです。 ありがとう!二次ベジエ補間

+0

私は既にいくつかの複雑な数学的なものを見てきましたが、それは私がas2で行う方法がわからない積分を含んでいます –

答えて

5

ベジェ曲線の計算は実際には非常に簡単なので、これを手助けしてActionScriptに変換することができます。

2D二次ベジエ曲線は、3つの(x,y)座標で定義されます。私はこれらをP0 = (x0,y0),P1 = (x1,y1)およびP2 = (x2,y2)と呼んでいます。さらに、パラメータ値tは、0から1の範囲で、曲線に沿った任意の位置を示すために使用されます。すべてx,yおよびtは実数(浮動小数点)です。

二次ベジェ曲線の式は次のとおりです。

for i = 0 to step_count 
    t = i/step_count 
    u = 1 - t 
    P = P0*u*u + P1*2*u*t + P2*t*t 
    draw_ball_at_position(P) 

これは、あなたがすでに定義されていることを前提としています

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

ので、擬似コードを使用して、我々がスムーズにそうようなベジェ曲線をトレースすることができます上記のように点P0,P1およびP2となる。コントロールポイントを均等に配置すると、カーブに沿ってすばらしいステップが得られるはずです。 step_countを、あなたが見たいカーブに沿ったステップの数に定義してください。

1

式ははるかに効率的に数学的に実行できることに注意してください。

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

P = P0*u*u + P1*2*u*t + P2*t*t 

両方を簡略化することができるTの乗算を保持します。例えば

C = A*t + B(1-t) = A*t + B - B*t = t*(A-B) + Bは=あなたは1回の乗算=ダブルパフォーマンスを救いました。

+4

あなたは数倍を保存することができるかもしれませんが、バーンスタインの基礎は本質的に数値的に安定しています。したがって、精度が問題となる場合は、多項式を再構成しないでください。確かに、これはボールのアニメーション化にはあまり重要ではありませんが、これはCADパッケージでは非常に重要です。 – Naaff

1

Naaffによって提案された解決策は、それがP(t) = P0*(1-t)^2 + P1*2*(1-t)*t + P2*t^2で、あなたに正しい「形状」を取得しますが、[0:1]間隔で等間隔​​tを選択すると、等間隔P(t)を生成しません。言い換えれば、速度は一定ではありません(これを見るためには、tに関して前の式を区別することができます)。

通常、一定速度でパラメトリック曲線をトラバースする一般的な方法は、弧長で再パラメータ化することです。これは、PP(s)と表すことを意味し、sは、曲線に沿って横切る長さである。明らかに、sはゼロから曲線の全長まで変化する。二次ベジェ曲線の場合、弧長の閉形式解がtの関数としてありますが、それは少し複雑です。計算上、好きな方法を使って数値的に統合するほうが速いことがよくあります。しかし、その考え方は、t(s)という逆の関係を計算し、PP(t(s))と表現することに注意してください。次に、等間隔のsを選択すると、均等なスペースPが生成されます。