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

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

时间:2024-06-08 16:11:20浏览次数:24  
标签:13 连接点 Konva 路径 算法 区域 折线 数组

这一章把直线连接改为折线连接,沿用原来连接点的关系信息。关于折线的计算,使用的是开源的 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源码

示例地址

标签:13,连接点,Konva,路径,算法,区域,折线,数组
From: https://www.cnblogs.com/xachary/p/18238704

相关文章

  • TCP_CLOSING_13:[已关闭] RST -> [已关闭]
    测试目的:本测试用例的目的是验证当TCP处于CLOSED状态时,对于接收到的RST(重置)控制消息的处理机制。根据TCP协议规范,当TCP在CLOSED状态时,它应该忽略任何接收到的RST消息,并且不会产生任何响应。描述:TCP连接在CLOSED状态下是完全关闭的,不准备进行任何数据传输或连接建立。在这......
  • 代码随想录算法训练营第五十天| 198.打家劫舍、213.打家劫舍II、337.打家劫舍 III
    198.打家劫舍文档讲解:代码随想录题目链接:.-力扣(LeetCode) 问题:计算你不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。也就是说相邻的房间不能偷当前房屋偷与不偷取决于前一个房屋和前两个房屋是否被偷了。所以这里就更感觉到,当前状态和前面状态会有一种依赖......
  • html+CSS+js部分基础运用13
    一、三级联动效果如下图所示:图1三级联动二、设计江苏福彩投注站彩票投注助手编程实现江苏福彩投注站彩票投注助手,页面布局效果如图2所示。图2福彩投注站彩票助手页面功能要求如下:单击“机选1注”、“机选5注”或“机选10注”按钮时,能够随机产生相应条数的数据。......
  • 华为OD刷题C卷 - 每日刷题 13(图像物体的边界,英文输入法)
    1、(图像物体的边界):这段代码是解决“图像物体的边界”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,以及一个内部UnionFindSet类,用于计算像素1代表的物体的边界个数。main方法首先读取二维数组的行数m和列数n,然后读取二维数组matrix中的像素值。接着,调用......
  • Q13 LeetCode76 最小覆盖子串
    1.难题2.need.containsKey(r)看hashmap中是否含有r3.明天再复盘一遍  1classSolution{2publicStringminWindow(Strings,Stringt){3if(s==null||s.isEmpty()||t==null||t.isEmpty()||s.length()<t.length())return"";4......
  • 解决Docker遇到error NU1301: Unable to load the service index for source https://
    解决Docker容器内无法通过HTTPS访问外部网络的问题在使用Docker构建.NET项目时,有时会遇到无法通过HTTPS访问外部网络的问题,导致dotnetrestore命令无法从NuGet源下载依赖项。本文将介绍一种通过修改Docker配置文件config.json来解决该问题的方法。问题描述在......
  • 6月13日在线研讨会 | 多产品多流程多团队的ALM选择方案
        随着汽车产业步入“软件定义汽车”时代,传统汽车产业的硬件中心模式逐渐被软件与服务的核心地位所取代,这是一场对汽车设计、制造及运营的全方位重塑。在这一转型过程中,如何高效管理汽车的整个生命周期成为了一项全新挑战。在此背景下,应用生命周期管理(ALM)平台应运而生,以......
  • Java使用poi导出excel折线图--以三温层车辆运输单据温度为例(含如何更改各标题大小)
    maven依赖引入<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> ......
  • 智能合约开发中13种最常见的漏洞
    在智能合约开发过程中,确实存在多种类型的漏洞,这些漏洞可能导致资金损失、合约功能失效或被恶意利用。以下是智能合约开发中常见的漏洞类型:1.重入攻击2.整数溢出和下溢3.未授权访问4.不当的继承顺序5.短地址攻击6.断言失败7.代理模式中的初始化漏洞8.时间依赖性漏洞9.Gas限......
  • Android 13.0 hal层关于新增自定义hal模块功能实现
    1.前言在13.0的系统rom定制化开发中,在对hal模块进行开发时,需要通过添加自定义的hal模块来实现某些功能时,就需要添加hal模块的相关功能,接下来就来实现一个案例来供参考接下来就来具体实现这个功能2.hal层关于新增自定义hal模块功能实现的核心类hardware\interfaces\3.ha......