답변:
깔때기 알고리즘을 찾고 있습니다.
여기 당신은 간단한 것입니다
http://digestingduck.blogspot.com.es/2010/03/simple-stupid-funnel-algorithm.html
기본적으로 알고리즘은 가장자리를 포털로 식별하고 가장자리의 정점에 대해 테스트되는 깔때기를 만들어 깔때기 내부에 있는지 여부를 확인합니다.
단계 A에서 깔때기는 시작 위치와 포털이 노란색 선으로 교차하여 구축됩니다.
B 단계에서 다음 포털이 확인되고 상단 정점이 깔때기 내부에 있으므로 깔때기 상단이 통과합니다. 그러나 녹색 선 아래에 빨간색 선이 있으므로 하단 정점이 깔때기에서 벗어납니다. 따라서 하단 선은 통과하지 않고 이전 포털의 하단 정점을 계속 통과합니다.
확인할 수 있듯이 깔때기가 더 작고 작아지는 단계 F까지 깔때기를 만들 수없는 곳에서 빨간색 선이 잘못된 깔때기를 만들기 때문에 상단 정점이 새로운 시작점으로 선택되고 새 깔때기가 엔드 포인트가 해당 메시에없는 경우 빌드합니다.
이러한 종류의 알고리즘을 사용하면 모델 크기 문제에 대한 간단한 솔루션도 가능합니다. 모델의 2 배 반경에 의해 포털이 더 작다는 것을 고려할 수 있기 때문입니다.
이 가시선 아이디어를 사용하여 생성 된 경로와 함께 사용할 수있는 간단한 기술이 있습니다. 기본적으로, 당신은 길을 걷고 싶어하며, 각 노드에서, 마지막 노드보다 두 개의 노드가 "돌아가서" 보이는지 확인합니다. 마지막 이전 노드가 표시되면 마지막 노드를 제거 할 수 있습니다 (현재 노드와 마지막 이전 노드 사이에 가시선이 있기 때문에 중간 노드 인 마지막 노드는 필요하지 않습니다).
Gamasutra 기사 에는 다음과 같은 의사 코드 예제가 있습니다.
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
기능이 기본적으로 가시선 기능이지만 경로가 보이지만 걸을 수없는 상황 (예 : 구덩이, 함정, 제한 구역)도 포함하도록 약간 개선되었습니다.