光滑寻路算法在绘图中的应用
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值相同时,后计算的方向将会被丢弃,结果最后得到的结果可能不是最优的。解决办法就是先计算出起始节点到目标节点的最短路径,再计算目标节点到起始节点的最短路径,取其中较短的那条。
相关文章推荐
- 算法-基础(二)绘图库的应用
- Unity算法——A*(AStar)寻路算法概要及简单应用
- 关于寻路算法的一些思考(11):寻路算法的其他应用
- 支持向量机(SVM)算法在人脸识别上的应用
- Lucas-Kanade 算法原理以及应用
- 算法设计与应用基础:第十四周(2)
- 一种高效的寻路算法 - B*寻路算法
- 算法导论学习笔记-5.4 概率分析和指示器随机变量的应用-几个有趣的问题
- Silverlight.XNA(C#)跨平台3D游戏研发手记:(二)四叉树遍历与人工智能A*算法在SLG移动路径范围测算中的应用
- 智能摄像机的硬件架构及算法类型应用
- otsu自适应阈值分割的算法描述和opencv实现,及其在肤色检测中的应用[转]
- 数学/物理知识在软件/算法中应用(1)
- Computer Vision: Algorithms and Applications 计算机视觉:算法与应用 翻译工作 序
- 图像处理之积分图应用二(快速边缘保留滤波算法)
- 算法设计与应用基础: 第六周(1)
- [Tensorflow]1.交叉熵(Cross Entropy)算法实现及应用
- 机械专业的计算机集成制造系统课中窥看到的计算机算法应用(二)
- 异常检测(Anomaly detection): 异常检测算法(应用高斯分布)
- 【算法】算法的应用(一)
- 如何将数据结构和算法应用到实际之中?