其实市面上没什么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://51itzy.com/kjqy/67002.html