JS计算两个节点间的最短路径

已经有step1和step2两个节点,每个节点有4个可连接点,如何让step1或step2移动过程中,它们之间的路径始终最短,也就是如何让结点间的连线按照一定的规则动态变化,保证两个节点间的线段距离最短。

这里可以假设step2是圆心,step1到step2的距离为半径,step1绕step2做圆周运动,step1和可移动角度正好是360度,就可以根据角度变化来确定两个点之间的线段使用哪两个连接点来连接。

如上图,把360度等分成4部分,当step1旋转至各自区域时,线段就连接step1的可连接点。同理,用相同的方式,把step1看作是圆心,step1也可以根据角度得到最短路径的可连接点。

两个点旋转的角度可以根据三角函数来计算,其中step1的坐标是x1,y1,step2的坐标是x2,y2:

ini 复制代码
const radians = Math.atan2(y2 - y1, x2 - x1);
const deg = (radians * 180 / Math.PI + 360) % 360;

获取旋转的角度就可以开始获取可连接点:

lua 复制代码
if (deg > 315 || deg < 45) {
  // 设置可连接点
} else if (deg > 45 && deg < 135) {
  //
} else if (deg > 135 && deg < 225) {
  // 
} else if (deg > 225 && deg < 315) {
  // 
}

最终实现的效果:

预览地址

相关推荐
用户3600555790021 分钟前
Kestrel_VLLM - 26 · 发射空档三步曲:事件计时 → nsys → 判别实验
前端
echome88826 分钟前
JavaScript async/await 错误处理:别让 Promise 静默失败
开发语言·前端·javascript·promise
PedroQue9942 分钟前
v0.2.0 架构升级:class + reactive 重塑状态管理
前端·uni-app
鶴哥只手遮天42 分钟前
Angular 22 源码级深度解析-第 02 章 编译链路总览:从模板字符串到 `ɵɵ` 指令
前端·开源·angular.js
尘世中一位迷途小书童42 分钟前
别再堆万字 Prompt:用 Agent Skills 给团队写一个「前端 Review」Skill
前端·ai编程·cursor
aixingpan1 小时前
aixingpan.cn API开发文档:api_docs_bichart_common2接口指南
前端·php
super_Omni1 小时前
text/PDF/Word → 解析成纯文本 → 分词 → 词表匹配 → 加权打分 → 低于阈值
前端·chrome
阶进遐1 小时前
浏览器工具自制指南·对话导出(3):消息池设计
前端
SameX1 小时前
HarmonyOS 用 relationalStore 做阅读统计 App —— 5 张表背后的 5 个 schema 决策
前端
LV技术派1 小时前
【成为 AI Native Builder · 02】什么是 AI Native Builder:一个人 + AI,交付完整闭环
前端·程序员·ai编程