回答:
ファンネルアルゴリズムを探しています。
ここにあなたは簡単な人です
http://digestingduck.blogspot.com.es/2010/03/simple-stupid-funnel-algorithm.html
基本的に、アルゴリズムはエッジをポータルとして識別し、エッジの頂点に対してテストされるファンネルを作成して、ファンネル内にあるかどうかを確認します。
ステップAでは、じょうごは開始位置とポータルが黄色の線で交差した状態で作成されます。
ステップBでは、次のポータルがチェックされ、上部の頂点がじょうごの内側にあるため、じょうごの上の線が通過します。しかし、下の頂点は漏斗の外にあります。これは、赤の線が緑の線の下にあるため、下の線は通過せず、前のポータルの下の頂点を通過し続けるためです。
確認できるように、ステップFまでファンネルは小さくなり、小さくなります。この場合、ファンネルを作成することはできません。赤い線はファンネルが悪いため、上部の頂点が新しい開始点として選択され、新しいファンネルは終点がそのメッシュ内にない場合は作成します。
ポータルはモデルの2倍の半径だけ小さいと見なすことができるため、この種のアルゴリズムはモデルサイズの問題の簡単な解決策にもなります。
この見通し線のアイデアを使用して生成されたパスで使用できる簡単なテクニックがあります。基本的には、パスをたどって、各ノードで、前のノードの 2つ前のノードを「振り返って」、表示されているかどうかを確認します。最後の前のノードが表示されている場合は、最後のノードを削除できます(現在のノードと最後の前のノードの間に見通し線があるため、中間ノードである最後のノードは必要ありません)。
ガマストラの記事には、次の擬似コードの例があります。
checkPoint = starting point of path
currentPoint = next point in path
while (currentPoint->next != NULL)
if Walkable(checkPoint, currentPoint->next)
// Make a straight path between those points:
temp = currentPoint
currentPoint = currentPoint->next
delete temp from the path
else
checkPoint = currentPoint
currentPoint = currentPoint->next
このアルゴリズムは望みどおりにWalkable
機能します。関数は基本的に見通し内関数ですが、パスが表示されているが歩行できない状況(ピット、トラップ、制限区域)も含まれるように少し改善されています。