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

求直线上距起点指定长度的点的坐标

优雅解法:基于向量的线性插值

直接用向量归一化+线性插值的方式,从根源避开斜率计算带来的除零、多分支判断问题,具体步骤如下:

  1. 计算起点到终点的向量分量:

    • dx = p₁.x - p₀.x
    • dy = p₁.y - p₀.y
  2. 计算起点到终点的总长度L:

    • L = sqrt(dx² + dy²)
      (仅需一次极端情况判断:若L趋近于0,说明p₀与p₁重合,直接返回p₀即可)
  3. 计算目标点相对于起点的比例系数t:

    • t = D / L
      (若需支持超出终点的延伸场景,直接保留t的计算结果即可,无需额外逻辑)
  4. 计算目标点坐标:

    • target_x = p₀.x + t * dx
    • target_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 23:42:03