[英]Python shortest distance between a point and a line segment in 3D and intersection point on the segment
我正在寻找 python 实现 3D 中的点和线段与线段上的交点之间的最短距离
这是使用numpy
的实现:
def min_distance(r: np.ndarray, a: np.ndarray):
""" Compute the minimal distance between a point and a segment.
Given a segment of points xa and xb and a point p
Parameters
----------
r
xb - xa
a
xa - p
Returns
-------
d
The minimal distance spanning from p to the segment
"""
min_t = np.clip(-a.dot(r) / (r.dot(r)), 0, 1)
d = a + min_t * r
return np.sqrt(d.dot(d))
给定一个段,由两个点xa
和xb
以及一个通用点p
标识。 我们定义以下数量
线段上的通用点具有坐标:
所以点p
到线段上一个通用点的距离是:
我们希望最小化平方距离(我们使用平方距离使计算更容易一些)
IE
这为我们提供了使距离最小化的t
值(实际上是静止的)。
现在我们需要记住,我们必须保持 ,所以我们可以钳制
t
。
计算d(t_min)
将给出最小距离。
距离将是返回的d
的范数: np.linalg.norm(d)
或等效的np.sqrt(d.dot(d))
。
我建议使用scikit-spatial 库。
点线距离可以通过以下方式计算:
from skspatial.objects import Line
line = Line([5, 2, -3], [3, 8, 2])
line_point_distance = line.distance_point([5, -5, 3]).round(3)
那么,你所说的交点就是这个点在直线上的投影:
point_projected = line.project_point(point)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.