自动寻路之 --WStar算法

  其实市面上没什么WStar 算法,只是我这样叫而已。至于为什么?那大概就是他和我之前写的AStar 算法很相似基本上算是借鉴过来的还有思路上的相似。

  【主要功能】

   得到地图目标点下,所有地图点的最优路径走向

    WStar 可顺带实现得到多个目标点的下,所有地图点的最优路径走向

  看图最清楚了

  【实现思路】  

  AStar 算法主要是单条路径(单个目标点)的找寻,那么就有问题了在如果你想得到地图上所有点的最优路径走向呢?总不能将所有的点用AStar算一遍吧!坑爹的那是!可以这样说AStar是单项的深度遍历而WStar是多项的宽度遍历。而且在地图中如果存有多个目标点的话AStar也只能一个一个的算,而WStar一遍就可得到多个目标点的最优路径走向。

  不明白AStar算法的请移步我之前写的AStar的博文,因为其思路大体是相似的,但WStar相对来说比较简单。

  先说一下AStar 的核心思路吧!

  a.利用开闭两个容器将可利用与不可利用资源划分

  b.开容器的内容过滤与增长

  WStar大概也是这样的基本没变什么,只是思路相对的变得更为线性。

之前是:
        if (FindPath(start, end))
        {
            return GetPathPoints(start, end);                          //返回最佳移动点集
        }
        else
        {
          return new Vector3[1] { sPos };
        }
之后呢:
        if (FindPath())
        {
            return this.GetPointDirections();                          //返回最佳移动方向
        }
        else {
            return null;
        }
注意的我注释啊!WStar返回的是所有点的最佳方向。
而不是之前AStar的最佳移动点集,至于Why?数据量啊,你还想用链表保存整个地图的最佳移动路径吗?那数据量你能承受算我没说。

  那么此刻我们的心中就应该只有起点和终点了,当然还有那万恶的墙啊!

  既然只有起点和终点了那么将其连线就是最短的路径了,我们的思路就由此展开。

  我们得到最优路径可已从起点开始走也可以从终点开始走,像我们走路一样但不同的是我们可以有四个方向(N、E、S、W)或者八个方向(加上 NE、NW、SE、SW),甚至更多由你定了,我之后实现的是四个和八个(其实8-4==4喽)。

  有了方向与此刻的位置,那么只要你的记忆好就可以走到终点(运气不考虑),而恰恰最重要的就是怎么走呢?AStar是像是给死了的递归duang的就出来了到终点了(开玩笑别当真啊),那针对地图上所有的点呢?那就绝对不要让你的计算机去干这种粗活了,你需要一个新的点子给他了。

  既然要针对地图上所有的点甚至是多个目标点的路径获取,那么就不应该用之前AStar 的结果存储方式不然想想都头大,那么怎么办呢?最好是每个点只保留一个轻量数据就就将整个地图中的数据囊括,是什么?我觉得嘛!用方向就好了啊!就像疯狂的海面上的各种涡流你的走向只与你当前的水流方向有关不管只要顺着方向走肯定完蛋(比喻啊),总之是目标达成!

  下一步就是怎么得到这些地图点的正确方向呢? 

那么假定地图是这样的,我们就需要为所有的【 ?】算出最佳的方向来。

我想图出来你的思路应该就很清晰了,即多目标点并行的开始计算(可以说是得到吧)周围一圈的最佳方向,然后一次类推就OK!赶脚是不是很简单呢!

【实现策略】

1.先跟着AStar走将所有目标点放入容器(队列)内,

2.弹出底端数据,得到周围一圈的最佳方向(注意如果周围一圈有的已经有方向了那么将其舍弃)

3.将刚得到的方向的点作为新的目标点开始扩散

4.加入目标点 --放入容器

5.到第二步就好,直到容器为空整个地图就搞好了

【演示结果】

https://blog.csdn.net/f980511

 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值