前端使用 Konva 实现可视化设计器(13)- 折线 - 最优路径应用【思路篇】

news/2025/1/21 0:03:16/文章来源:https://www.cnblogs.com/xachary/p/18238704

这一章把直线连接改为折线连接,沿用原来连接点的关系信息。关于折线的计算,使用的是开源的 AStar 算法进行路径规划,启发方式为 曼哈顿距离,且不允许对角线移动。

请大家动动小手,给我一个免费的 Star 吧~

大家如果发现了 Bug,欢迎来提 Issue 哟~

github源码

gitee源码

示例地址

灵感来源主要来自于下面优秀的文章:

关联线探究,如何连接流程图的两个节点

主要参考了:如何挑选连接点及其真正的出入口、算法的选型。具体代码没有仔细了解,毕竟布局和元素的想法不一样,没必要参考代码。

路径规划之 A* 算法

主要了解一下算法的介绍。

欧式距离、曼哈顿距离、切比雪夫距离、Octile距离

主要了解一下 AStar 算法的各种启发方式的差异。

路径规划可视化动画

形象的感受路径搜索的差异。

至于算法本身,在目前阶段下不是必须深入分析,这里应用为主。

最优路径

image

参考这张图,基于当前案例,可以把折线想象为路径,目标就是查找最优路径,例如:
image

又或者:
image

上面明显不是我们直觉最优的路径选择,如:

  • 太贴近节点了
  • 转弯太多

更希望是这样:
image
image

开启调试模式,来说说连接点的出入口:
image

人为地,距离”连接点“偏离一些,定义所谓的”出入口“(途中绿色的点),作为折线真的起点和终点。

把连线先移除,看看其他点:
image

一共定义了 3 种点:

  • 连接点(红色)
  • 出入口(绿色)
  • 途径点(蓝色)

关于途径点,是人为挑选的,主要(中心点除外)来自于图中不同颜色区域(线框),这里定义了 ?种区域:

  • 连接点最小区域

为什么叫节点区域呢?因为此前设计的连接点是动态的,它可以节点内部的其他位置,只是目前定义的都是上下左右边缘而已。所以,它可能比节点区域更小。

image

  • 连线不可通过区域

image

  • 连线不可通过扩展区域

两个区域共同所在的最小区域

image

  • 连线通过区域

image

  • 连线通过扩展区域

同理,两个区域共同所在的最小区域

image

算法建模(关键)

上面说了那么多点和区域,最终目的就是为了建模,可供算法使用。
这个模型,就是一个数组矩阵 matrix,可以理解成一个格子地图,如:
image

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, 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],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]

计算结果是一个途径格子坐标数组:

坐标就是数组1、2层下标,可以视作 x、y 轴。
image

[[5, 3],[6, 3],[7, 3],[8, 3],[8, 4],[8, 5]
]

主要问题来了,毕竟在这里的画板,不同于算法示例那样“走格子”,800x800 的画布大小,不可能建一个 800x800 数组矩阵,性能可吃不消,别说更大的画布了。

所以,如何建模才是这个案例画折线的关键!

这里,那一个大一点的例子说明:
image

既然,拿“像素”当作格子不现实,可以拿“点”作为格子不就好了吗?
image

数组矩阵变成:

[[0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0]
]

这里缺少了“墙”,哪些是墙?其实就是上面说的不可通过区域:
image

“墙”不同于连接点,需要补充一些点:
image

数组矩阵变成(增加了 2 列、2 行):

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]

然后给数组矩阵设置“墙”:

这里把 2 定义为墙,所以 0、1 均能通过,方便后面区分和理解。

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0],[0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0], [0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0],[0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0],[0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0],[0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0], [0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]

连接点、连接线的出入口不应该是“墙”,调整一下:

设置为 1,方便区分

image

起点:[2, 3]
终点:[8, 5]
image

现在交给算法,计算结果得出:
image

就是:
image

画成线:
image

主要思路就是如此,虽然不是完美的,请看:
image

原因主要是算法并不知道拐弯的“代价”,暂且如此吧。
思路的介绍到此为止,下一章再说说代码大概是如何实现的。

More Stars please!勾勾手指~

源码

gitee源码

示例地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/721855.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot热部署设置

在使用SpringBoot进行开发过程中,我们往往会对代码进行反复修改并对项目进行部署查看效果,这时反复重启SpringBoot会很麻烦,因此使用热部署是提高开发效率的必备插件——“spring-boot-starter-test” <!--SpringBoot热部署依赖--> <dependency> <gr…

redis zset源码

zset底层是由hash字典和跳表实现的,字典存储member->分数的映射关系,这样根据membe查询score的 时间复杂度O为1 跳表可以理解为多个层级的有序链表,每个节点可能在不同层级上,通过在不同层级的跳跃查找,把查询时间复杂度降低到 Olgn 1.随机层数,只有0.25的概率升级层数…

C++U7-08-拓扑排序

拓扑:是指把实体抽象成与其大小形状无关的点,把连接实体的线路抽象成线,研究这些点线之间的相连关系。而表示点和线之间关系的图就被称为拓扑结构图。 拓扑学原本是一个数学概念,描述的是几何图形或空间在连续改变形状后还能保持不变的性质,它只考虑物体间的位置关系而不考…

管式土壤墒情监测仪:引领农业与环境研究的革命性工具

在农业科技日新月异的今天,管式土壤墒情监测仪凭借其独特的优势,已逐步成为农业和环境领域不可或缺的研究装备。这款监测仪,基于先进的介电常数原理,以其卓越的精确度和强大的功能,为研究人员提供了详尽而深入的土壤墒情数据,为探索土壤状况揭开了新篇章。管式土壤墒情监…

本地部署GLM-4-9B清华智谱开源大模型方法和对话效果体验

清华大学和智谱AI推出了全面升级的新一代基座大模型GLM-4,整体性能相比GLM3提升60%,支持128K上下文,可根据用户意图自主理解和规划复杂指令、完成复杂任务……GLM-4-9B是清华大学和智谱AI推出的最新一代预训练模型GLM-4系列中的开源版本。在语义、数学、推理、代码和知识等多…

minos 2.5 中断虚拟化——vGIC

首发公号:Rand_cs这一节开始讲述真正的中断虚拟化,首先来看硬件方面的虚拟化。前文 minos 2.3 中断虚拟化——GICv2 管理 主要讲述 GICv2 的 Distributor 和 CPU Interface,在 Hypervisor 存在的情况下,它们都是为 Hypervisor 服务的。现在有了 vm,vm 里面的内核也需要操作…

minos 2.6 中断虚拟化——虚拟中断子系统

首发公号:Rand_csHypervisor 需要对每个虚机的虚拟中断进行管理,这其中涉及的一系列数据结构和操作就是虚拟中断子系统 VIRQ 虚拟中断描述符 struct vcpu {uint32_t vcpu_id; .........../** member to record the irq list which the* vcpu is handling now*/struct virq_st…

minos 1.2 内存虚拟化——guest

首发公号:Rand_csminos 1.2 内存虚拟化——guest项目来自乐敏大佬:https://github.com/minosproject/minos本文继续讲述 minos 中的内存虚拟化中关于 guest 的部分,主要弄清楚一个问题,minos 如何管理 guest vm 的内存。 对于虚拟机的内存管理主要是 ipa 的管理,ipa 如何映…

minos 2.1 中断虚拟化——ARMv8 异常处理

首发公号:Rand_cs越往后,交叉的越多,大多都绕不开 ARMv8 的异常处理,所以必须得先了解了解 ARMv8 的异常处理流程 先说一下术语,从手册中的用词来看,在 x86 平台,一般将异常和中断统称为中断,在 ARM 平台,一般将中断和异常统称为异常 异常的流程,可以分为 3 个阶段,…

NSSCTF———MISC

[NISACTF 2022]huaji? [SWPU 2020]套娃 [LitCTF 2023]What_1s_BASE (初级) [SWPUCTF 2021 新生赛]gif好像有点大 [NISACTF 2022]为什么我什么都看不见 [LitCTF 2023]404notfound (初级) [LitCTF 2023]这羽毛球怎么只有一半啊(恼 (初级) [LitCTF 2023]喜欢我的压缩包么 (初级)…

BLP 模型

公号:Rand_csBLP 模型 本篇文章是调研了许多资料后对 BLP 模型的一个总结 MLS,Multi-level Security,主要关心的是数据机密性 D. Elliott Bell 和 Leonard J. LaPadula 在 1996 年提出了基本的 BLP 模型,主要有两个性质:The Simple Security Property states that a subje…

小端序题目——[LitCTF 2023]debase64

还挺有价值的,记录一下 题目DIEPE文件在Windows操作系统下默认使用小端序 IDA main函数绿框:输入长度要20 红框:base64加密 黄框:加密后的结果要与关键数据相等获取数据,我一般喜欢调试看栈,这样就少一次翻转了 取出15个数据:0x46, 0xED, 0x18, 0x96, 0x56, 0x9E, 0xD2,…