JavaScript 实现绘制两个坐标之间的连线

实现原理

 先概括一下大概的实现原理,分为两步:

 第一步:我们需要在两个坐标连线的中点上创建一条长度和连线长度相等的直线,这条线的中点也在两个坐标连线的中点上。此时效果大概是这样子:

 第二步:在第一步的基础上,我们再将这条直线顺时针旋转图上红色虚线标出的角度,它就成为了两个坐标之间的连线。

JavaScript实现步骤

计算连线的中点坐标

javascript 复制代码
const midX = (x1 + x2) / 2;
const midY = (y1 + y2) / 2;

计算连线的长度

 下图中的虚线和两个坐标间的连线正好组成一个三角形,由勾股定理可以计算出连线的长度:

javascript 复制代码
  const a = x2 -x1;
  const b = y2 - y1;
  const length = Math.sqrt(a * a + b * b);

计算需要旋转的角度

 由下图我们可以看出,这条水平的直线需要旋转的角度实际上就是三角形左侧夹角的角度。

 为了方便求这个夹角的角度,我们假设可以把这个三角形平移到原点,变成这个样子:

 之后,我们就可以利用Math.atan2(y, x)求得这个夹角的角度。这个方法会返回某个坐标到原点的连线与x轴正方向之间的弧度。需要注意的是:该方法返回的是弧度, 角度 = (弧度 * 180) / Math.PI。

javascript 复制代码
  const a = x2 -x1;
  const b = y2 - y1;
  const c = (180 * Math.atan2(b, a)) / Math.PI;

 至此我们得到了连线的中点坐标、连线的长度、连线旋转的角度。我们通过固定定位 + top/left实现连线的定位、transform: rotate()实现连线的旋转。

完整的JavaScript实现

javascript 复制代码
export const drawLine = (startObj, endObj) => {
    // 起点坐标
    const startY = startObj.y;
    const startX = startObj.x;

    // 终点坐标
    const endY = endObj.y;
    const endX = endObj.x;

    // 用勾股定律计算出斜边长度及其夹角(即连线的旋转角度)
    const a = endX - startX;
    const b = endY - startY;
    // 计算连线长度
    const length = Math.sqrt(a * a + b * b);
    // 弧度值转换为角度值
    const c = (180 * Math.atan2(b, a)) / Math.PI;

    // 连线中心坐标
    const midX = (endX + startX) / 2;
    const midY = (endY + startY) / 2;
    const deg = c <= -90 ? 360 + c : c; // 负角转换为正角

    return {
        position: 'fixed',
        top: `${midY}px`,
        left: `${midX - length / 2}px`,
        width: `${length}px`,
        transform: `rotate(${deg}deg)`,
    };
};

   

引用文章:
css实现两点之间的连线
Math.atan2用法及应用场景

相关推荐
Ai-_Man1 小时前
您您这可以把Grok的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭
javascript·人工智能·ai·小程序·电脑
传人once1 小时前
多图片上传预览功能如何写
前端·css·html·jquery·html5
Eric.461 小时前
Wan‑Animate+MiniMax-H3 本地部署 AI 漫剧流水线:8G 显存动作迁移与动态分镜工程实战
前端·人工智能·comfyui·ai漫剧
liangshanbo12151 小时前
JavaScript 异步核心主线
javascript·事件循环·异步操作
传人once3 小时前
悬停旋转放大和位移效果如何写
javascript·css·动画
库拉镜像AI牛牛3 小时前
短剧内容自动化生产:知漫剧工作室落地教程
大数据·服务器·前端·人工智能·语音识别
律宏阔3 小时前
Flutter 列表图片内存优化:CachedNetworkImage 与 ClipRRect 的取舍
前端·flutter
行者全栈架构师3 小时前
【鸿蒙心迹】相册文搜图工程化落地:HarmonyOS 7.0 端侧 AI 检索全链路实战与 5 个踩坑解法
前端
律宏阔3 小时前
Dart 3 Record:解决 Future.wait 异构返回值的类型问题
前端·flutter
Seraphina363 小时前
DVWA(XSS Reflected/Stored High,CSRF Low)
前端·xss·csrf