我想计算导航网格中的视线。
考虑下图,黄线仅是A *的结果,红线是使用黄线作为输入的“视线”算法的结果。现在,设备可以直接移动而无需“曲折”。
计算该“视线”的算法是什么?
我想计算导航网格中的视线。
考虑下图,黄线仅是A *的结果,红线是使用黄线作为输入的“视线”算法的结果。现在,设备可以直接移动而无需“曲折”。
计算该“视线”的算法是什么?
Answers:
您正在寻找漏斗算法。
这是一个简单的
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
函数本质上是视线函数,但对其进行了稍微改进,以包括路径可见但不适合步行的情况(例如坑,陷阱,限制区域)。