2012-07-03 9 views
10

私はそれにx座標が与えられているので、私はキュービックベジェ曲線上のY座標を見つけることを可能にする何らかの方法を探していました。キュービックベジェ曲線のYを求めると、

私はキュービック関数を扱って根を見つけようとしていますが、キュービックベジエ曲線の方程式は(x座標の場合)です: X x2 + t2 * x2 + t3 * X3

何が起こったのか?(1-t)^ 3 * X0 + 3 *(1-t)私を混乱させるのは、(1-t)値の追加です。たとえば、X値にいくつかの乱数を入力すると...

400 =(1-t)^ 3 * 100 + 3 *(1-t)^ 2 * t * 600 + 3 *( 1-T)* T^2 * 800 + T^3 * 800

次に三次方程式スタイルに再配置:^ 3 + 3 *(1-T)800トン^ 2 + 3

800トン(1-t)^ 2 * 600t +(1-t)^ 3 * 100 -400 = 0

私はまだ(1-t)ブロックの問題を抱えています。私は、(1-t)が最初に分かっていないとき、どのように私がtを解くべきかを考え出すことができません。

アイデア?

+1

さらに数学の質問... –

+1

非常によく、私は数学の人々に代わりに尋ねるでしょう。私はそれがコンピューティングで使用されていると仮定すると、ここの人々が知りうるかもありがとうございました。 –

答えて

2

私はこれが公正なCS質問であると思うので、私はこれをどのように解決するかを試してみるつもりです。与えられたxはそれに関連して1より大きいy値を持つかもしれないことに注意してください。私がこれを必要とした場合は、そうでないことが保証されていますので、あなたが望むものを決定する方法を見つけなければなりません。

xとyの値の配列を生成してtを繰り返しました。私は私の目的のためにかなり高い解像度でそれをやった。 (私は8ビットのルックアップテーブルを生成しようとしていたので、1000ポイントを使用しました)。次のxと次のy座標のベジェ式にtを接続して配列に格納しました。一度全体が生成されたら、配列をスキャンして、最も近い2つのx値を見つけました。 (または完全一致があった場合は、それを使用しました。)次に、私は必要なy値を得るために、その小さな線分を線形補間しました。

5

キュービックベジェ曲線を表現する3つの一般的な方法があります。

xの関数として第二Tの関数として最初のx

x(t) = sum(f_i(t) a_i) 
    = (1-t)^3 * x0 + 3*(1-t)^2 * t * x1 + 3*(1-t) * t^2 * x2 + t^3 * x3 

Yを

y(x) = sum(f_i(x) a_i) 
    = (1-x)^3 * y0 + 3*(1-x)^2 * x * y1 + 3*(1-x) * x^2 * y2 + x^3 * y3 

これら最初の二つは、単に変数に異なる名前を使用して、数学的に同一です。

「立方体ベジェ曲線上のY座標を見つけて、その上にx座標がある」と判断してください。私はあなたが2番目の方程式を使って質問する必要があると推測しています。2番目の方程式を使うべきであるところで、それを解決するのに役立つ最初の方程式を再配置しようとしています。その場合、再配置や解決は必要ありません。xの値を差し込むだけで解決策が得られます。

3番目のケースの方程式がある可能性があります。これは醜いハードケースです。 これは、xとyの両方のパラメータで、3番目の変数tの3次ベジエです。

x(t) = sum(f_i(t) x_i) 
y(t) = sum(f_i(t) y_i) 

これが該当する場合。私に知らせて、それを解決するために必要なことを詳述することができます。

+0

パラメータ化されたバージョンを解決できますか?私はパラメータ化された 'x'と' y'を持っています。私は '' x 'を与えて '' y' 'が必要です。だから私は 't'を知らないが' x'を知っている。 – activatedgeek

+1

@activatedGeek - あなたのケースを必ずしも解決することはできません。解決策、1つの解決策、多くの解決策、または無限に多くの解決策(悲しい)が存在する可能性があります。ベジェ曲線はコントロールポイントの凸包に収まることが保証されています。次に、各セグメントCVHがあなたのx値を越える可能性があるかどうかを検討します。次に、各セグメントで、ベジエセグメントの新しいリストを取得するために、ベジエの中間点分割を適用します。すべてのセグメントが十分に小さくなるまで、破棄と分割を繰り返します。彼らはあなたの解決策です。 –

+0

私はソースにまっすぐ行くでしょう。 [this](http://cubic-bezier.com/#.17,.67,.83,.67)の仕組みを教えてください。曲線がどのように左に描かれているのか理解しています。私が理解できないことは、アニメーションの時間を変換して、 'T秒 'のアニメーションをカバーするための'ベジェ曲線'の 't'パラメータをどのようにマップするのでしょうか。 – activatedgeek

1

あなたが実行した場合、さらにあなたは(1 - t)要因

を取り除く必要がある式を開発:

wxMaximaまたは Maple(あなたがが、このいずれかでパラメータ tを追加する必要があります)のいずれかで
expand(800*t^3 + 3*(1-t)*800*t^2 + 3*(1-t)^2*600*t + (1-t)^3*100 -400 = 0); 

、あなたが得る:

100*t^3 - 900*t^2 + 1500*t - 300 = 0 

はのための新たな三次方程式を解きます10(あなたがそのためにthe cubic equation formulaを使用することができます)あなたはtを得た後、あなたはxがやって見つけることができます:

x = (x4 - x0) * t  (asuming x4 > x0) 
0

をだから私は私がY-を見つけることができるようにする方法のいくつかの並べ替えを探しまわってきましたキュービックベジェ曲線上でx座標を指定して座標を指定します。

点(0、0)と(0,100)の間の3次ベジェ曲線を(0,33)と(0,66)の制御点で考えます。与えられたXには無限の数のYがあります。したがって、任意の3次ベジェに対してXを与えてYを解く方程式はありません。堅牢なソリューションのために

は、あなたはおそらく、個々のセグメントは直線に近似するまで再帰的に De Casteljau's algorithm

分割して曲線を開始することをお勧めします。次に、これらのさまざまな線分があなたのxを傍受するかどうか、またはxがあなたが探しているxに対応する垂直線分であるかどうか(上記の私の例)を検出できます。