服务器寻路04-漏斗算法

2021/03/26 Path

服务器寻路04-漏斗算法

目录

A*算法应用于三角形网格

1.三角形导航网格

1.方格地图网格都是规则的正方形网格,因此在计算网格距离时,只需要计算网格中心点之间的距离。
2.与方格网格地图不同,A*用于三角网络导航网格具有不规则性,导致 G(n)值和 h(n)的计算不能统一。  

2.需要对 G(n)值和 h(n)的计算方法加以改进

改进策略:
  G(n)为当前三角网格至下一个网格代价总和,H(n)为三角形中心到目标三角中心的距离。

如上图公式:
     三角网格自身代价为穿入边 AB 中点至穿出边 AC 中点的距离。
     因为AB中心点和AC中心点相连的长度即为BC边长度的一半,所以穿入边和穿出边中心相连的长度即等于上图公式计算所得的值。

漏斗算法路径平滑处理

1.基础A*算法

1.当使用三角形节点时,例如在导航网格中,最常用的方法是简单地使用连接两个三角形的每条边的中点。

2.如上图:
      该图为基础A星算法寻路后的多边形路径,其中A星算法是以三角形边中点作为距离运算的迭代点的。

3.但是这样并不能代表其最优真实路径,需要进一步利用漏斗算法进行路径平滑处理(也称拉绳算法),从而生成实际最优路径,
并且看起来更光滑。

2.漏斗算法原理

1.漏斗算法背后的思想是,通过遍历三角形列表中的连接边(上图中的虚线),我们可以找到需要顶点的点(即遍历一个角落)。
2.我们这里将黄色虚线线段称为“portal”,方便讲解。
3.继续看,步骤A中,我们的漏斗被初始化为顶点(start)和左右两边(第一个portal的顶点)。我们会维护“漏斗”的顶点和左右
  两条边,两条边之间的区域是我们可以从漏斗顶点直线可达的最大区域,漏斗外的区域会没有portal,不可行走。
4.步骤B到D,然后逐一查看每个portal,根据需要更新左右两边:
  a.步骤B,首先移动左边连接到下一个portal的左边顶点,发现移动后的左边介于移动前左右两条边之间,表明左边的移动是可接受的,于是更新左边。
  b.步骤C,接着移动右边,移动右边连接到portal的右顶点,发现移动后右边也介于移动前左右两条边之间,更新右边。
  c.我们到此发现,漏斗是在逐步变窄的。
  d.步骤E,我们遇到问题了,如果我们像之前所做的那样继续穿过portal顶点,漏斗就会变宽,并最终与路径的边缘相交。
    也就是橘色线段往外扩,导致漏斗变宽并且出现可行走区域外的橡胶部分。因此,我们跳过更新左边缘,移动到步骤F。
  f.步骤F,很不幸我们拥有了另外一个问题。在更新漏斗的右边时,我们让它穿过了左边,因此这次移动也被拒绝,
  g.步骤G,我们将顶点设置到这个位置,并将其添加到路径顶点列表中,并重新初始化左右两边。然后该算法继续,直到找到目标。

5.概括漏斗算法步骤:
  。尝试缩小漏斗
  。如果新的端点扩大漏斗,跳过。
  。如果新的端点穿过另一边,添加新的顶点并重新初始化漏斗。
参考链接:
1.https://gamedev.stackexchange.com/questions/68302/how-does-the-simple-stupid-funnel-algorithm-work
2.http://www.cppstore.com/article-626.html
3.基于多边形导航网格地图的改进 A*算法(朱昌龙 1,2,刘黎志)
4.http://ahamnett.blogspot.com/2012/10/funnel-algorithm.html

Search

    Table of Contents