zoukankan      html  css  js  c++  java
  • A*分层寻路

    A*分层寻路

    作者:Patrick Lester 2003年1月9日更新
    译者:Panic 2005年7月21日
    译者序:很久没有翻译文章了,这次找了这个短一些的。这个文章是偶以前翻译的《A*寻路初探》的补充,介绍了A*更进一步的,更实用的方法。

    原文链接:http://www.policyalmanac.org/games/twoTiered.htm
    以下是翻译正文:

     

    在我的主题A* Pathfinding for Beginners中(译者注:译文 A*寻路初探)中,我概述了A*算法,说明了如何创建一个通用的寻路功能。然而仅创建一个寻路功能,用途是很有限的。
    考虑如下的RPG场景,一个剑士想找到绕过旁边墙壁的路:

    对于这类地图,你可以用不同的方式,密度来放置节点。在这个例子中,我们使用高密度网格,如下:

    在这个图中,白色节点是可通过的。没有节点的地方是不可通过的。这个例子还有一些不同的地方。在这个例子中,你可以“穿越”不可通过区域的拐角。同时,“方格”也不再是方格。因为这是一个投影视角的例子,我们在Y(垂直方向)拥有X(水平方向)两倍的节点。这使得正确的投影路径成为可能。

    如你所见,用这么密集的节点网络,我们不仅能寻路绕过旁边的墙壁,还能在墙壁和旁边的桶之间找到路径。我们密集的网格也使得绕过底部不可通过的火把成为可能。这总的说来是精确寻路。

    好,在短距离上,那的确很酷,但是如果我们要穿越整个地图进行寻路,该怎么办?使用像这么密的网格,轻易就会让你在一条路径上使用A*的搜索节点的数量达到10,000+。这几乎会让任何PC失去响应。

    那么我们来看另一种选择。创建一个低密度的网格,就像下面这样,如何?

    在这个例子里,节点在等边菱形的中心。菱形之间通过性的数据沿边界存储在同一个数组中,在图片上用小红点表示。要从一个图素移动到它周围8个图素上,相邻的图素必须是可通过的,并且路径没有被挡住。

    这个节点网格的密度是先前的72分之一。原来我们需要面对10,000+的节点,而现在,取而代之的是1/72原来的数量,或者说,少于200个。我们的电脑可以轻易处理这个。穿越地图寻路的问题迎刃而解。

    合而为一

    那么,我们用哪种方法呢?两者!

    在给定的搜索中,你得先在地图范围内,用宏观寻路的方法。然后切换到微观寻路,寻找从当前位置到路径上两个宏观节点以外的路径。每次你进入一个宏观菱形“方格”,你应该用微观寻路算法寻路到两个宏观节点之前。这导致浪费了每次微观寻路的后半截路径,但是你有必要这样做以便路径看起来足够好-并且这也不是很严重的浪费,因为你的微观寻路算法只计算了相关的一小段路径。一旦你到达了距离目标2-3宏观节点的地方,你应该完全切换到微观寻路算法,完成到最终位置的寻路。

    用这种方法,你将得到更接近现实的快速穿越地图的寻路以及能穿越角落,木桶等等就像最开始那个微观寻路例子的效果。有够酷,哈!

    如果你 真的 有野心,你可以开发3种寻路器,如果你的地图实在太大,一个工作在真正的宏观层次,一个在中间层,一个在微观层。专家已经为像帝国时代(Age of Empires)这样的游戏设计了这些。这仅仅取决于你的需要。

    好,就这些了。像以前一样,你可以通过这个联系我:

    现在,祝你好运。

    译者参考文章:
     A*寻路初探
     在A*寻路中使用二叉堆

  • 相关阅读:
    说说Cookie和Session
    说说SQL Server的数据类型
    Java访问权限控制
    数据库-- 触发器
    关于jni编译32位、64位动态库(Android.mk和Application.mk文件)
    Android中的 init.rc文件简介
    Android系统属性简介
    Android Support 包知识
    Android窗口机制分析与UI管理系统
    Android界面架构(Activity,PhoneWiondow,DecorView)简介
  • 原文地址:https://www.cnblogs.com/chengmin/p/2360892.html
Copyright © 2011-2022 走看看