求直线上距起点指定长度的点的坐标
优雅解法:基于向量的线性插值
直接用向量归一化+线性插值的方式,从根源避开斜率计算带来的除零、多分支判断问题,具体步骤如下:
计算起点到终点的向量分量:
dx = p₁.x - p₀.xdy = p₁.y - p₀.y
计算起点到终点的总长度
L:L = sqrt(dx² + dy²)
(仅需一次极端情况判断:若L趋近于0,说明p₀与p₁重合,直接返回p₀即可)
计算目标点相对于起点的比例系数
t:t = D / L
(若需支持超出终点的延伸场景,直接保留t的计算结果即可,无需额外逻辑)
计算目标点坐标:
target_x = p₀.x + t * dxtarget_y = p₀.y + t * dy
方案优势
- 彻底规避斜率计算中的除零问题,无论直线是垂直、水平还是任意角度,逻辑完全统一
- 无需大量条件判断,代码简洁易维护
- 计算过程数值稳定,不会触发clang sanitizer的除零或数值异常告警
代码示例(C++)
#include <cmath> struct Point { double x; double y; }; Point getPointOnLine(Point p0, Point p1, double D) { double dx = p1.x - p0.x; double dy = p1.y - p0.y; double L = sqrt(dx*dx + dy*dy); // 处理两点重合的极端边界情况 if (L < 1e-9) { return p0; } double t = D / L; Point target; target.x = p0.x + t * dx; target.y = p0.y + t * dy; return target; }
内容的提问来源于stack exchange,提问作者keith969
相关产品推荐
相关产品推荐

