点到线段最短距离求解及已有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
相关产品推荐
相关产品推荐

