You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现绿色箭头指向两个红色Canvas的中心点?

实现绿色箭头Canvas指向两个红色Canvas的中点

需求说明

我有三个尺寸为200x200的Canvas,需要让绿色箭头Canvas指向两个红色Canvas的中间位置。

已尝试的角度计算代码

首先是计算两点间角度的函数:

function angle(cx, cy, ex, ey){
    const dy = ey - cy;
    const dx = ex - cx;
    const rad = Math.atan2(dy, dx);
    const deg = rad * 180 / Math.PI;
    return deg;
}

然后获取两个红色Canvas的中心点坐标:

// 获取第一个红色Canvas的中心点(视口坐标)
const anchor1 = document.getElementById('canva1');
const rekt1 = anchor1.getBoundingClientRect();
const anchorX1 = rekt1.left + rekt1.width / 2;
const anchorY1 = rekt1.top + rekt1.height / 2; 

// 获取第二个红色Canvas的中心点(视口坐标)
const anchor2 = document.getElementById('canva2');
const rekt2 = anchor2.getBoundingClientRect();
const anchorX2 = rekt2.left + rekt2.width / 2;
const anchorY2 = rekt2.top + rekt2.height / 2; 

完整实现步骤

要让箭头正确指向中点,还需要补充以下步骤:

  1. 计算两个红色Canvas的中点坐标
const midX = (anchorX1 + anchorX2) / 2;
const midY = (anchorY1 + anchorY2) / 2;
  1. 获取绿色箭头Canvas的中心点
const arrowCanvas = document.getElementById('arrow-canvas');
const arrowRekt = arrowCanvas.getBoundingClientRect();
const arrowCenterX = arrowRekt.left + arrowRekt.width / 2;
const arrowCenterY = arrowRekt.top + arrowRekt.height / 2;
  1. 计算箭头指向中点的角度
const angleDeg = angle(arrowCenterX, arrowCenterY, midX, midY);
  1. 应用旋转到箭头Canvas
// 设置旋转原点为箭头Canvas的中心
arrowCanvas.style.transformOrigin = 'center center';
// 应用旋转变换
arrowCanvas.style.transform = `rotate(${angleDeg}deg)`;

注意事项

  • 如果页面存在滚动,getBoundingClientRect()返回的视口坐标需要加上window.scrollX和window.scrollY来得到文档坐标,避免滚动后位置偏移:
    const anchorX1 = rekt1.left + rekt1.width / 2 + window.scrollX;
    const anchorY1 = rekt1.top + rekt1.height / 2 + window.scrollY;
    
  • 确保箭头Canvas的初始方向是指向右侧(0°方向),如果初始箭头是向上或其他方向,需要在计算出的角度基础上加上偏移量(比如初始箭头向上,需要加90°)。

内容的提问来源于stack exchange,提问作者user20202873

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:25:26