2011-07-26 38 views
3

2次曲線の最も近い点をマウスの位置に計算する際に問題が発生しています。私はいくつかのAPIを試しましたが、これが機能するための機能を見つけるのに幸運はありませんでした。私は、5次の立方体ベジェ曲線に対して機能する実装を見つけましたが、2次曲線に変換する数学スキルはありません。私はt値があれば問題を解決するのに役立ついくつかの方法を見つけましたが、どのようにtを見つけるのか分かりません。誰かがtを見つけるためのアルゴリズムや、二次曲線上の最も近い点を任意の点に見つけるためのコード例を私に教えてもらえれば、とても感謝しています。2次ベジェ曲線の最も近い点

おかげ

+0

ほとんどの場合、5次曲線で見つかった実装は、変更なしで2次曲線でも機能します。 – toto2

答えて

1

私はあなたが数学を始めることができます。 私はベジェがどのように定義されるか、二次わからないんだけど、それはへ 同等でなければなりません:

(x(t), y(t)) = (a_x + b_x t + c_x t^2, a_y + b_y t + c_y t^2), 

0 < t < 1。 a、b、cは曲線を定義する6つの定数です。あなたは(X、Y)までの距離たい

:あなたは上記の量を最小限に抑えtを見つけたいので

sqrt((X - x(t))^2 + (Y - y(t))^2 ) 

を、あなたはtへの 一次導関数の相対を取り、0に等しいことを設定します。 tで次方程式がある

0 = (a_x - X + b_x t + c_x t^2) (b_x + 2 c-x t) + (a_y - Y + b_y t + c_y t^2) (b_y + 2 c_y t) 

: これは、あなたが(SQRTと2倍を落とす)を与えます。分析ソリューションは既知であり、Web上で見つけることができます。 tの力の係数(すなわち、0 = a + b t + c t^2 + d t^3)を得るために、おそらく少しの代数を行う必要がある。代わりに、ニュートン・ラフソンを使って数値的にこの方程式を解くこともできます。

ただし、3つの解決策のいずれもあなたの範囲にない場合は、0 < t < 1に注意してください。その場合は、(X、Y)(最初の式)までの距離の値をt = 0t = 1に計算し、2つの最小距離を取るだけです。

EDIT
あなたは一階微分= 0を解くときに実際に、あなたが得る解決策は、最大距離だけでなく、最低限のことができます。したがって、得られる解の距離(最初の等式)(tの3つまでの値)とt=0t=1の距離を計算し、それらの値の実際の最小値を選択する必要があります。

+0

数学は大きな助けとなりました。私は自分の問題を理解した。 – matt

-1

ダム、素朴な方法は、最小のものが勝者であると、曲線上の各点を反復し、その点とマウス位置の間の距離を計算することであろう。あなたのアプリケーションにもよりますが、あなたはそれよりも優れたものと一緒に行かなければならないかもしれません。

+1

カーブ上の各点は?誰がそれをどうやって行うのですか? –

+0

カーブが既知の座標リストから生成されている場合。そうでない場合は、別の解決策が必要です。 –

+1

これはベジェ曲線です。座標は制御点​​のみを提供し、曲線上の点は提供しません。 –

0

Java実装のオンラインhereに簡単に適用できるActionScript実装があります。

Google Books hereで閲覧できる「Graphics Gems」という書籍のアルゴリズムから派生したものです。

関連する問題