已知直线上两点P1、P2及P2到P3的距离,如何计算P3的坐标?
通用计算逻辑
核心思路基于向量运算,无需判断象限、直线倾斜角或延伸方向,可覆盖所有合法场景:
- 计算P1指向P2的向量
(dx, dy) - 计算P1、P2两点的距离
L - 对向量
(dx, dy)做单位化处理,得到单位方向向量 - 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
相关产品推荐
相关产品推荐

