3

二次曲線上のマウスの位置に最も近い点を計算する際に問題が発生します。私はいくつかのAPIを試しましたが、これが機能する関数を見つけることができませんでした。5次の3次ベジェ曲線で機能する実装を見つけましたが、2次曲線に変換するための数学のスキルがありません。価値がある場合に問題を解決するのに役立ついくつかの方法を見つけましたが、tを見つけ始める方法がわかりません。誰かがtを見つけるためのアルゴリズム、または2次曲線上の任意の点に最も近い点を見つけるためのサンプルコードを教えてくれれば、私は非常に感謝しています。

ありがとう

4

3 に答える 3

0

ここからオンラインで入手できるJavaに簡単に適応できるActionScript実装があります。

これは、Googleブックスで閲覧できる「GraphicsGems」という本のアルゴリズムから派生しています

于 2011-07-26T02:49:38.540 に答える
0

私はあなたに数学を始めさせることができます。二次ベジエがどのように定義されているかはわかりませんが、次と同等である必要があります。

(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) までの距離が必要です。

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

上記の量を最小化するを見つけたいのでt、その一次導関数を相対的に取り、それtを 0 に設定します。これにより、次のようになります (sqrt と 2 の係数を削除します)。

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) 

これは の 3 次方程式ですt。分析ソリューションは既知であり、Web 上で見つけることができます。累乗の係数を取得するには、おそらく少し代数を行う必要がありますt(つまり、0 = a + bt + ct^2 + dt^3)。代わりに、たとえばニュートン ラフソンを使用して、この方程式を数値的に解くこともできます。

ただし、3 つのソリューションのいずれも範囲内にない可能性があることに注意してください0 < t < 1。その場合、 と で (X, Y) (最初の式) までの距離の値を計算し、2 つの中で最小の距離t = 0t = 1取ります。

編集
実際には、一次導関数= 0を解くと、得られる解は最大距離と最小距離になる可能性があります。したがって、得られる解 ( の最大 3 つの値) の距離 (最初の式) と、 および での距離を計算し、tそれらすべての値の実際の最小値を選択する必要があります。t=0t=1

于 2011-07-26T02:41:08.927 に答える
-1

ばかげた、素朴な方法は、曲線上のすべてのポイントを反復処理し、そのポイントとマウスの位置の間の距離を計算することです。最小のものが勝者です。アプリケーションによっては、それよりも優れたものを使用する必要がある場合があります。

于 2011-07-26T02:05:48.880 に答える