目標が次の場合:
1) エッジの数を最小限に抑えます。
2) 距離を最小限に抑えます。
その順序で、次のように試すことができる1つのこと:
1) 最初から最後まで線を引きます。
2) ラインが衝突するすべてのオブジェクトを計算します。
3) これらのオブジェクトごとに、パスを 2 つのパス セグメントに分割できるオブジェクトに垂直な両方の点を計算します。長方形の場合、ラインを 2 つのセグメントに分割し、セグメント A では通過できる 4 つのコーナーのどれを確認し、セグメント B では通過できる 4 つのコーナーのどれを確認し、見つかるまですべての組み合わせを試すことで、これを行うことができます。最小変位を与える 2 つ。円の場合、その方法を忘れてしまいましたが、2 つのパス セグメントが円に面している両側に 1 つのソリューションしかないため、三角法または何かを使用してそれを行うことができます (私はそれを試してみます :) )
両方の新しいパスに対して、再帰的な分岐方式で 4) を呼び出します。
4) 生成した両方の線分について、衝突がなくなるまで計算を繰り返します。A* と同様に、最初に最適と思われるパスを計算する必要があります (残りの衝突が最も少ないか、それが難しすぎる場合は最初に最も浅いパスを実行します)。
5) 任意のメトリクスで最適なパスを選択します。A* のやり方では、メトリクスを介して最適なパスが一番上になるようにリストをソートしておく必要があります。そのため、最初のパスを選択して終了することができます。
これが常に機能することを頭の中で証明することはできませんが、以前に似たようなものを見たことがあります。
編集
円の周りの一方向で 2 つの線分の最も近いパスを計算するには、線分ごとに次のようにします。
-サイド A: 行頭 (または行末) xs,ys から円の中心 xc,yc まで、長さ = a
-サイド B: 中心 xc,yc から円周上のどこかに行くので、長さ = r
-サイド C: サイド B のエンドポイントから xs,ys (斜辺) に移動します。
A と B によって形成される角度は直角であり、A と B の長さはわかっているので、C の長さは sqrt(A^2+B^2) として計算できます。
最後に、C の長さ = A の長さ/sin(角度(B から C)) = B の長さ/sin(角度(A から C)) がわかります。つまり、三角法を実行して、A から C への角度と角度 B を見つけることができます。 Cに。
これにより、パス セグメントの片側を完全に構築できます。反対側についても繰り返します。パスが 2 つに分割され、両方のセグメントが円に対して同じ高さになります -> 追加される距離が最小化されます。