美文网首页
凸面多边形寻路算法

凸面多边形寻路算法

作者: ssochi | 来源:发表于2018-12-28 15:54 被阅读0次

写在前面

什么是凸面多边形

凸多边形是一个内部为凸集的简单多边形。凸多边形(Convex Polygon)指如果把一个多边形的所有边中,任意一条边向两方无限延长成为一直线时,其他各边都在此直线的同旁,那么这个多边形就叫做凸多边形,其内角应该全不是钝角,任意两个顶点间的线段位于多边形的内部或边上。

凸面多边形在寻路应用中有什么性质

凸面多边形一条边上的任意一点到另外一条边上的任意一点总是可达的。

什么是floyd算法

http://blog.csdn.net/qq_35644234/article/details/60875818

什么是地图网格

地图网格就是一个凸面多边形的集合
如果可视化就是这样


这里写图片描述

数据结构定义

三维向量(Vector3):

sequenceDiagram
x->>Vector3: double
y ->>Vector3:double
z ->>Vector3:double

顶点(Vertex):

sequenceDiagram
postion->>Vertex: Vector3
id ->> Vertex:int

边(Edge):

sequenceDiagram
v1->>Edge: Vertex
v2 ->>Edge:Vertex

凸面(Convex):

sequenceDiagram
vertexs->>Convex: ArrayList<Vertex>

网格(Mesh):

sequenceDiagram
convexs->>Mesh: List<Convex>
edgeNodeSplitLength->>Mesh:double
name->>Mesh:String

UML:

sequenceDiagram
double->>Vector3:x
double->>Vector3:y
double->>Vector3:z
Vector3->>Vertex:postion
int->>Vertex:id
Vertex->>Edge:v1
Vertex->>Edge:v2
Vertex->>Convex:ArrayList<Vertex> vertexs
Convex->>Mesh:List<Convex> convexs
double->>Mesh:edgeNodeSplitLength
String->>Mesh:name
int->>Node:id
Vector3->>Node:postion
Connection->>Node:HashMap<Integer, Connection>() connections
ConvexInfo->>Node:ArrayList<ConvexInfo> convexs
Edge->>Node:edge
int->>Connection:cost
Node->>Connection:to
Edge->>EdgeInfo:edge
Node->>EdgeInfo:ArrayList<Node> nodes
ConvexInfo->>EdgeInfo:ArrayList<ConvexInfo>
int->>ConvexInfo:id
Convex->>ConvexInfo:convex
EdgeInfo->>ConvexInfo:ArrayList<EdgeInfo> edges
Node->>ConvexInfo:ArrayList<Node> nodes
Integer->>ConvexInfo:HashSet<Integer> nodeIds
Rect->>ConvexInfo:box

步骤

1.数据预处理
2.通过floyd算法生成P矩阵
3.利用P矩阵求出路径列表
4.优化路径
5.输出

数据预处理

1.遍历Mesh中每个Convex,生成多边形所有的边
2.将每条边进行切割生成对应的点
3.将位于同一个Convex的点之间建立连通关系并计算权值(通过距离)

通过floyd算法生成P矩阵

1.初始化floyd算法需要的D矩阵和P矩阵
2.通过之前的连通图执行floyd算法
3.生成P矩阵

利用P矩阵求出路径列表

1.输入起点from,终点to
2.在P矩阵中查找P[from][to]查询下一步的节点next
3.将查询到的结果记录下来,并让from = next
4.循环以上操作获得路径列表

优化路径

为什么要优化路径

未优化的路径:
[图片上传失败...(image-6fc23e-1538123978488)]
优化后的路径:
[图片上传失败...(image-796ae3-1538123978488)]
1.优化后经过的节点数更少
2.优化后路径更自然
3.优化后路径更短

如何优化

首先我们挨个判断每个点是否需要保留。这里通过一种基于视点范围的方法来判断,
我们首先令from点为视点(viewPosition)(及路径中的第一个点),
那么第二个点则为cur点,
我们令cur所在edge的两端点到视点的向量为最小左视野(minLegLeft)和最小右视野(minLegRight)。

现在将cur赋值为第三个点,
我们令cur所在edge的两端点到视点的向量为左视野(legLeft)和右视野(legRight)。
如果cur到viewPosition的向量没有在最小视野当中,证明cur是不可达的,
那么此时最小左视野所在边上的路径点就叫做拐点。
我们首先调整拐点位置,将拐点加入优化后的路径表中,并将拐点作为viewPosition重新进行上述循环。
如果legLeft在minLegLeft右边那么我们令minLegLeft = legLeft
如果legRight在minLegLeft左边那么我们令minLegRight = legRight

如何调整拐点位置

调整拐点位置是为了使路径更自然,所以我们应该让视点到拐点与下一个到拐点的向量的夹角变小。
如果此时拐点到下一点的连线在最小左视野左边则拐点往左移,反之往右移。

相关文章

  • 凸面多边形寻路算法

    写在前面 什么是凸面多边形 凸多边形是一个内部为凸集的简单多边形。凸多边形(Convex Polygon)指如果把...

  • 百度无人驾驶apollo项目路径规划a*算法分析

    算法分析 车辆路径规划寻路算法有很多,apollo路径规划模块使用的是启发式搜索算法A*寻路算法。 a*算法是一种...

  • Unity学习笔记——A*寻路算法的应用

    初步了解了一些寻路算法后,本以为dijstra是比较合适的寻路算法,今天仔细看了关于A星寻路算法的教程和视频后,我...

  • 算法:A*寻路算法

    A*Search,是一种寻找有效路径的算法。 [OpenList][CloseList][F = G + H]Op...

  • JPS寻路算法

    JPS寻路算法是啥?JPS全称是:jump point search,这个算法实际上是对A* 寻路算法的一个改进,...

  • Hello,a~*寻路算法!

    寻路算法是游戏中经常用到的算法之一,而这其中A~* 算法大概是我们最耳熟的寻路算法了,下面我们会通过A~* 算法与...

  • A*寻路算法

    原文:http://www.cnblogs.com/wangnfhy/p/4956711.html 参考:http...

  • A*寻路算法

    代码实现

  • A* 寻路算法

    A 算法*是一种解决图遍历问题的计算机算法,在电子游戏中最主要的应用是寻找地图上两点间的最佳路线。 不能朝障碍物所...

  • cocos creator Astar寻路导航与地图编辑

    1、插件或者TileMap工具生成地图json文件 2、astar寻路算法 3、将json文件与寻路算法结合,获得...

网友评论

      本文标题:凸面多边形寻路算法

      本文链接:https://www.haomeiwen.com/subject/txmpoftx.html