java凸多边形寻路_凸面多边形寻路算法

写在前面

什么是凸面多边形

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

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

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

什么是floyd算法

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

什么是地图网格

地图网格就是一个凸面多边形的集合

如果可视化就是这样

8bd059394d025ff8d92bf0f2926cb49f.png

数据结构定义

三维向量(Vector3):

Created with Raphaël 2.1.2 x x Vector3 Vector3 y y z z double double double

顶点(Vertex):

Created with Raphaël 2.1.2 postion postion Vertex Vertex id id Vector3 int

边(Edge):

Created with Raphaël 2.1.2 v1 v1 Edge Edge v2 v2 Vertex Vertex

凸面(Convex):

Created with Raphaël 2.1.2 vertexs vertexs Convex Convex ArrayList

网格(Mesh):

Created with Raphaël 2.1.2 convexs convexs Mesh Mesh edgeNodeSplitLength edgeNodeSplitLength name name Listdouble String

UML:

Created with Raphaël 2.1.2 double double Vector3 Vector3 Vertex Vertex int int Edge Edge Convex Convex Mesh Mesh String String Node Node Connection Connection ConvexInfo ConvexInfo EdgeInfo EdgeInfo Integer Integer Rect Rect x y z postion id v1 v2 ArrayListvertexs Listconvexs edgeNodeSplitLength name id postion HashMap() connections ArrayListconvexs edge cost to edge ArrayListnodes ArrayListid convex ArrayListedges ArrayListnodes HashSetnodeIds 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.循环以上操作获得路径列表

优化路径

为什么要优化路径

未优化的路径:

9dd261b3695cdb099577387fa7952040.png

优化后的路径:

375c7209ce10b5c5c0bdeda97f0ff0da.png

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

如何调整拐点位置

调整拐点位置是为了使路径更自然,所以我们应该让视点到拐点与下一个到拐点的向量的夹角变小。

如果此时拐点到下一点的连线在最小左视野左边则拐点往左移,反之往右移。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值