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

点到线段最短距离求解及已有Python实现代码问题问询

点到三维线段最短距离实现

核心逻辑

计算逻辑遵循三维几何投影规则:

  • 先构造线段方向向量、线段起点到目标点的向量
  • 通过点积运算得到目标点在线段方向上的投影比例t
  • 对t做范围约束:t<0时最近点为线段起点,t>1时最近点为线段终点,其余情况取线段上的投影点
  • 最终计算目标点到最近点的距离,同时返回最近点坐标

可运行代码

原代码存在缩进错误、HTML转义字符问题,修正后可直接运行:

import math

def dot(v,w):
    x,y,z = v
    X,Y,Z = w
    return x*X + y*Y + z*Z

def length(v):
    x,y,z = v
    return math.sqrt(x*x + y*y + z*z)

def vector(b,e):
    x,y,z = b
    X,Y,Z = e
    return (X-x, Y-y, Z-z)

def unit(v):
    x,y,z = v
    mag = length(v)
    return (x/mag, y/mag, z/mag)

def distance(p0,p1):
    return length(vector(p0,p1))

def scale(v,sc):
    x,y,z = v
    return (x * sc, y * sc, z * sc)

def add(v,w):
    x,y,z = v
    X,Y,Z = w
    return (x+X, y+Y, z+Z)

def pnt2line(pnt, start, end):
    line_vec = vector(start, end)
    pnt_vec = vector(start, pnt)
    line_len = length(line_vec)
    line_unitvec = unit(line_vec)
    pnt_vec_scaled = scale(pnt_vec, 1.0/line_len)
    t = dot(line_unitvec, pnt_vec_scaled)    
    if t < 0.0:
        t = 0.0
    elif t > 1.0:
        t = 1.0
    nearest = scale(line_vec, t)
    dist = distance(nearest, pnt_vec)
    nearest = add(nearest, start)
    return (dist, nearest)

调用说明

  • 入参要求:三个参数均为(x,y,z)格式的三维坐标元组,分别对应目标点、线段起点、线段终点
  • 返回值:返回元组,第一个元素为最短距离浮点数,第二个元素为线段上最近点的坐标元组

补充提示:如果线段起点和终点坐标完全一致,代码会触发除零报错,建议调用前先判断start和end是否相等,若相等直接返回目标点到start的距离即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:09:03