您的位置:首页 > 其它

光滑寻路算法在绘图中的应用

2011-02-19 11:28 148 查看


最近一项目组需要将一批任务以关系图的形式进行展现。由于任务是动态的,关系图需要在服务器后台动态绘制。需要我协助绘图工具的选型和方案设计的工作。

关于绘图工具,我选择了JGraphX(mxGraph)的Java开源产品,这个玩意的优点是绘制出来的图形很漂亮,参数很多。缺点是文档,因为它相当于没有文档。

经过3天时间的不懈搜索和test,我终于掌握用JGraph绘制基本图形的方法。然后通过继承和封装,实现了绘制任务节点的接口。接下来就是最为困难的部分,如何在两个节点之间绘制连接线,使得

1. 连接线不穿过任务节点

2. 连接线走最短路径

3. 转折点要尽可能的少

4. 连接线尽可能不重叠

虽然A*寻路算法在网络上的文章已经很多了,但是关于绘制光滑的路径问题,在网络上资源还是很少。在某外国人的寻路算法文章中,提到绘制光滑的连接线,可以通过在转折点上施加不利因素来实现,或者当最短路径出来之后,重新遍历路径上的每一个点,用相似但更平滑的点来代替。

我选择通过施加不利因素的方式来控制转折点。具体算法如下:

1. 设置每次转折,需要耗费额外的行动力为CORNER_PLUS;

2. 每次重新设置G值(newG)前,同时估算在当前方向下,到达目标单元格最少还需要转多少个弯(CORNER_COUNT),并换算成行动力耗费(CORNER_COUNT*CORNER_PLUS)添加到曼哈顿函数值,作为新的H值(newH)。

3. 如果newH+newG < f,保存G值和H值,同时保存方向和上级上一个路径单元格。

但是这个算法有一个问题。当行走到某个单元格,两个方向进入的F值相同时,后计算的方向将会被丢弃,结果最后得到的结果可能不是最优的。解决办法就是先计算出起始节点到目标节点的最短路径,再计算目标节点到起始节点的最短路径,取其中较短的那条。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: