これは、動的プログラムで解決できます。
だが、列が最初のポリラインの頂点を表し、行は第二のポリラインの頂点を表すテーブル、等の問題を可視化してみましょう:
0 1 2 3 ... n-1 -> v
0
1
2
...
m-1
すべてのセルがポリライン間のエッジを表しています。 (0, 0)
で始まり、(+1, 0)
または(0, +1)
ステップのいずれかを取って(n-1, m-1)
へのパスを探したいとします。あなたが作るすべてのステップにはコスト(結果として生じる三角形の面積)があり、最小コストをもたらすパスを見つけたいと思っています。
したがって、(ダイナミックプログラミングのスタイルで)セルに到達するために必要なコストを計算することができます(2つの可能な到着方向の結果コストを比較することによって)。あなたが選んだ方向を覚えていれば、最後には最小コストの完全な道があります。ランタイム全体はO(n * m)
になります。
頂点が多かれ少なかれ分散していることがわかっている場合は、テーブルの計算を対角線の近くのいくつかのエントリに制限することができます。これにより、ランタイムがO(k * max(n, m))
になる可能性があります。k
は対角線の周りの可変半径です。しかし、良い頂点分布の仮定が成り立たなければ、最適解を見逃してしまうかもしれません。
セルを最小パスに属すると思ったときにのみ計算する、A *のような戦略を採用することもできます(ヒューリスティックの助けを借りて)。
Btw、実際には最小限の領域が実際に必要な領域であることを確認してください。私はあなたのためにそれが必要なのか分からないが、地域はあなたが望むほど直感的ではないかもしれない。特に、両方の線が同じ平面にある場合、すべてのテッセレーションは同じ総面積を持ちます。対角線の合計は、アプリケーションによってはより適切な場合があります。問題は少し異なります(コストは現在セルにあり、セル間のエッジではないため)が、同様に解決できます。 –
A *付きのチップをありがとう!たぶん、私は面積と対角線の重ね合わせを使うべきです。 –