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

已知直线上两点P1、P2及P2到P3的距离,如何计算P3的坐标?

通用计算逻辑

核心思路基于向量运算,无需判断象限、直线倾斜角或延伸方向,可覆盖所有合法场景:

  1. 计算P1指向P2的向量(dx, dy)
  2. 计算P1、P2两点的距离L
  3. 对向量(dx, dy)做单位化处理,得到单位方向向量
  4. P2坐标叠加「单位方向向量 * 要求的距离d」,即可得到P3坐标

你第二次尝试的算法逻辑方向是对的,唯一错误是偏移的基准点误用了P1,实际需要从P2出发做偏移,修正后代码如下:

interface Coordinates {
    x: number,
    y: number,
}

function getCoordinatesOfFollowingPointInDistanceToLastPointOnLine (p1: Coordinates, p2: Coordinates, distance: number): Coordinates {
    const dx = p2.x - p1.x;
    const dy = p2.y - p1.y;
    const p1P2Distance = Math.sqrt(dx ** 2 + dy ** 2);
    
    // 增加边界判断:P1和P2重合时抛出错误/返回默认值,避免除以0
    if (p1P2Distance === 0) {
        throw new Error('P1和P2坐标不能重合,无法确定直线方向');
    }

    const unitX = dx / p1P2Distance;
    const unitY = dy / p1P2Distance;

    // 从P2出发做偏移,而非P1
    const p3x = p2.x + unitX * distance;
    const p3y = p2.y + unitY * distance;

    return {
        x: Number(p3x.toFixed(3)),
        y: Number(p3y.toFixed(3))
    };
}

测试用例验证

以你失败的水平-∞方向测试用例为例:

  • P1坐标{x:2, y:1},P2坐标{x:1, y:1},d=2
  • dx=1-2=-1,dy=0,P1P2距离=1
  • 单位方向向量为(-1, 0)
  • P3x = 1 + (-1)*2 = -1,P3y=1+0=1,完全符合预期

该算法同样支持任意倾斜角场景,例如P1(0,0)、P2(1,1)、d=√2时,计算得到的P3坐标为{x:2, y:2},符合预期。


内容的提问来源于stack exchange,提问作者Krzysztof Kaczyński

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:06:06