回答:
これが私の試みです。次のアルゴリズムは完璧とはほど遠いですが、シンプルであるため、これから始めて、自分の状況で機能するかどうかを確認し、後でより速く、より正確に切り替える必要があります。
アイデアは次のとおりです。
ベジエ曲線はF(t)
、一連の制御点とさまざまなパラメーターを使用する関数によってパラメーター化されますt
。生成ポイントの数は重要ではありません。
線は2点A
とでパラメータ化されB
ます。
みましょうSAMPLES = 10
たとえば
で開始t0 = 0
し、t1 = 1
させる dt = (t1 - t0) / SAMPLES
場合dt < 1e-10
(またはその他の精度の条件あなたは、フィット感を参照)、アルゴリズムは終了し、答えはありますさF(t0)
。
SAMPLES + 1
ベジェ曲線上の点のリストを計算します。
L[0] = F(t0)
L[1] = F(t0 + dt)
L[2] = F(t0 + 2 * dt)
L[SAMPLES] = F(t0 + SAMPLES * dt)
L
インデックス付きのどのポイントがi
ラインに最も近いかを見つけます。任意の使用のポイント/ライン距離法あなたが知っている、例えば正方形の距離外積を示し、距離です。||AB^L[i]A||² / ||AB||²
^
||…||
の場合i == 0
、設定i = 1
; の場合i == SAMPLES
、設定i = SAMPLES - 1
させt1 = t0 + (i + 1) * dt
てt0 = t0 + (i - 1) * dt
手順3に戻ります。
今回はとでパラメータ化された2つのベジェ曲線がF(t)
ありG(t)
ます。
みましょうSAMPLES = 10
たとえば
始めてt0 = 0
、t1 = 1
、s0 = 0
およびs1 = 1
させる dt = (t1 - t0) / SAMPLES
させる ds = (s1 - s0) / SAMPLES
場合dt < 1e-10
(またはその他の精度の条件あなたは、フィット感を参照)、アルゴリズムは終了し、答えはありますさF(t0)
。
IFこれは、ループの最初の実行です。
6.1。SAMPLES + 1
ポイントのリストを計算しますF
(上記を参照)。
6.2。SAMPLES + 1
上の点のリストを計算しG
ます。
6.3。互いに最も近いポイントのペアを見つけます。
6.4。更新t0
、t1
、s0
、s1
上に見られるように。
ELSE:代替的にポイントのリスト計算F
OR上の点のリストG
上のどの点を見つけるその後、F
に最も近いG(s0)
更新とt0
とt1
、ORの点G
に最も近いF(t0)
と更新s0
とs1
。
手順3に戻ります。
設計により、これらのアルゴリズムは常にローカルミニマムに収束します。ただし、最適なソリューションに収束するという保証はありません。特に、ベジエ曲線アルゴリズムはまったく良くありません。多くの場所で2つの曲線が互いに近接している場合、残念ながらロングショットで解を逃す可能性があります。
しかし、私が言ったように、より堅牢なソリューションについて考え始める前に、まずこれらの簡単なソリューションを試してみるべきです。
1)すべてを1つの軸に変換します。1つのポイントの長さを計算する代わりに、「ライン」、「ライン」はY軸などになります。
それから、ええと、ベジェ曲線が与えられれば、制御点の数までだと思います。
3つ(開始、「制御」、終了)がある場合は、何らかのスキャンを実行します(それぞれ数パーセントと、次に「バイナリ」アプローチを使用して最も近いものの間で調整します)。
(翻訳されたY軸)に最も近いカップルを試してみます。
私は数学の男があなたに正確な解決策を(数学で)与えることができると確信していますが、ビデオゲームで解決策を見つけたい場合は、実際の解決策にはいくつかの答えが含まれている可能性があるため、少し大丈夫な解決策をお勧めします(私は処理能力についても話していません)。
Algorithmistブログページからのいくつかの回答は、与えられた2次ベジェ曲線上の最も近い点を正しく見つけます。
デモ。
ベジェ曲線の場合-直線の場合、答えを見つける最も正確な方法は次のことです。