这一章把直线连接改为折线连接,沿用原来连接点的关系信息。关于折线的计算,使用的是开源的 AStar 算法进行路径规划,启发方式为 曼哈顿距离,且不允许对角线移动。
请大家动动小手,给我一个免费的 Star 吧~
大家如果发现了 Bug,欢迎来提 Issue 哟~
灵感来源主要来自于下面优秀的文章:
主要参考了:如何挑选连接点及其真正的出入口、算法的选型。具体代码没有仔细了解,毕竟布局和元素的想法不一样,没必要参考代码。
主要了解一下算法的介绍。
主要了解一下 AStar 算法的各种启发方式的差异。
形象的感受路径搜索的差异。
至于算法本身,在目前阶段下不是必须深入分析,这里应用为主。
最优路径
参考这张图,基于当前案例,可以把折线想象为路径,目标就是查找最优路径,例如:
又或者:
上面明显不是我们直觉最优的路径选择,如:
- 太贴近节点了
- 转弯太多
更希望是这样:
开启调试模式,来说说连接点的出入口:
人为地,距离”连接点“偏离一些,定义所谓的”出入口“(途中绿色的点),作为折线真的起点和终点。
把连线先移除,看看其他点:
一共定义了 3 种点:
- 连接点(红色)
- 出入口(绿色)
- 途径点(蓝色)
关于途径点,是人为挑选的,主要(中心点除外)来自于图中不同颜色区域(线框),这里定义了 ?种区域:
- 连接点最小区域
为什么不叫节点区域呢?因为此前设计的连接点是动态的,它可以节点内部的其他位置,只是目前定义的都是上下左右边缘而已。所以,它可能比节点区域更小。
- 连线不可通过区域
- 连线不可通过扩展区域
两个区域共同所在的最小区域
- 连线通过区域
- 连线通过扩展区域
同理,两个区域共同所在的最小区域
算法建模(关键)
上面说了那么多点和区域,最终目的就是为了建模,可供算法使用。
这个模型,就是一个数组矩阵 matrix,可以理解成一个格子地图,如:
0 代表可通过,1 代表不可通过(称之为“墙”吧),对应的数组矩阵,就是
[
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0, 0,