2つの曲線上の最も近い点をどのように計算しますか?


回答:


3

これが私の試みです。次のアルゴリズムは完璧とはほど遠いですが、シンプルであるため、これから始めて、自分の状況で機能するかどうかを確認し、後でより速く、より正確に切り替える必要があります。

アイデアは次のとおりです。

  • ベジエ曲線をサンプリングし、そのサンプル上の最も近い点を見つけます
  • 見つかったポイントの周辺をサンプリングし、新しい最も近いポイントを見つけます
  • ポイントがあまり変化しなくなるまで続けます

ベジェ曲線から直線までの距離のアルゴリズム

ベジエ曲線はF(t)、一連の制御点とさまざまなパラメーターを使用する関数によってパラメーター化されますt。生成ポイントの数は重要ではありません。

線は2点Aとでパラメータ化されBます。

  1. みましょうSAMPLES = 10たとえば

  2. で開始t0 = 0し、t1 = 1

  3. させる dt = (t1 - t0) / SAMPLES

  4. 場合dt < 1e-10(またはその他の精度の条件あなたは、フィット感を参照)、アルゴリズムは終了し、答えはありますさF(t0)

  5. SAMPLES + 1ベジェ曲線上の点のリストを計算します。

    • L[0] = F(t0)
    • L[1] = F(t0 + dt)
    • L[2] = F(t0 + 2 * dt)
    • L[SAMPLES] = F(t0 + SAMPLES * dt)
  6. Lインデックス付きのどのポイントがiラインに最も近いかを見つけます。任意の使用のポイント/ライン距離法あなたが知っている、例えば正方形の距離外積を示し、距離です。||AB^L[i]A||² / ||AB||²^||…||

  7. の場合i == 0、設定i = 1; の場合i == SAMPLES、設定i = SAMPLES - 1

  8. させt1 = t0 + (i + 1) * dtt0 = t0 + (i - 1) * dt

  9. 手順3に戻ります。

ベジエ曲線からベジエ曲線までの距離のアルゴリズム

今回はとでパラメータ化された2つのベジェ曲線がF(t)ありG(t)ます。

  1. みましょうSAMPLES = 10たとえば

  2. 始めてt0 = 0t1 = 1s0 = 0およびs1 = 1

  3. させる dt = (t1 - t0) / SAMPLES

  4. させる ds = (s1 - s0) / SAMPLES

  5. 場合dt < 1e-10(またはその他の精度の条件あなたは、フィット感を参照)、アルゴリズムは終了し、答えはありますさF(t0)

  6. IFこれは、ループの最初の実行です。

    6.1。SAMPLES + 1ポイントのリストを計算しますF上記を参照)。

    6.2。SAMPLES + 1上の点のリストを計算しGます。

    6.3。互いに最も近いポイントのペアを見つけます。

    6.4。更新t0t1s0s1上に見られるように。

  7. ELSE:代替的にポイントのリスト計算F OR上の点のリストG上のどの点を見つけるその後、Fに最も近いG(s0)更新とt0t1ORの点Gに最も近いF(t0)と更新s0s1

  8. 手順3に戻ります。

課題

設計により、これらのアルゴリズムは常にローカルミニマムに収束します。ただし、最適なソリューションに収束するという保証はありません。特に、ベジエ曲線アルゴリズムはまったく良くありません。多くの場所で2つの曲線が互いに近接している場合、残念ながらロングショットで解を逃す可能性があります。

しかし、私が言ったように、より堅牢なソリューションについて考え始める前に、まずこれらの簡単なソリューションを試してみるべきです。


0

1)すべてを1つの軸に変換します。1つのポイントの長さを計算する代わりに、「ライン」、「ライン」はY軸などになります。

それから、ええと、ベジェ曲線が与えられれば、制御点の数までだと思います。

3つ(開始、「制御」、終了)がある場合は、何らかのスキャンを実行します(それぞれ数パーセントと、次に「バイナリ」アプローチを使用して最も近いものの間で調整します)。

(翻訳されたY軸)に最も近いカップルを試してみます。

私は数学の男があなたに正確な解決策を(数学で)与えることができると確信していますが、ビデオゲームで解決策を見つけたい場合は、実際の解決策にはいくつかの答えが含まれている可能性があるため、少し大丈夫な解決策をお勧めします(私は処理能力についても話していません)。


追伸 2つの曲線、それについても考えないでください(制御点の数に応じて(少なくともそうかもしれませんが)何かを得るかもしれません)
バルモンド


0

ベジェ曲線の場合-直線の場合、答えを見つける最も正確な方法は次のことです。

  1. Y = 0で直線が常に水平になるように問題を変換します。これは、すべての制御点に適切なアフィン行列を掛けることによって行われます。(3つの固定エントリを持つ3x3行列で平面のアフィン変換を表現することに精通していると思います。)
  2. コントロールポイントのY座標を調べます。すべての記号が同じではない場合、線と交差する可能性があります。ベジェ曲線のY部分の根を計算します。多項式には任意のルート検索方法を使用できますが、文献にはそれらがたくさんあります。たとえば、google "convex hull marching"-これは、ベジエ曲線で使用される多項式に適度に適した方法です。あなたが見つけるすべてのルートは、距離がゼロであるラインとの交点の時間値です-あなたの仕事は完了です。
  3. すべてのY座標に同じ符号がある場合、ベジェ曲線のY部分の導関数を計算します。ポイントのX座標は無視できます。違いがないため、ターゲットラインは水平です。その導関数の根を見つけます。これらは、曲線が線に局所的に最も近い時間値です。
  4. 前の手順で見つけたすべてのルートのベジェ曲線を明示的に評価し、ラインからの最小距離を与えるルートを報告します。エンドポイントも確認する必要があります。ルートよりも距離が短い場合があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.