我正在寻找一个Python函数,可以计算从3D点(x_0,y_0,z_0)到线段的距离,该线段由其端点(x_1,y_1,z_1)和(x_2,y_2,z_2)定义。
针对此问题,我只找到了2D的解决方案。
有一些解决方案可以在3D中找到从点到直线的距离,但不能到线段上,像这样:
(图片来自Calculate distance point to line segment with special cases)
我正在寻找一个Python函数,可以计算从3D点(x_0,y_0,z_0)到线段的距离,该线段由其端点(x_1,y_1,z_1)和(x_2,y_2,z_2)定义。
针对此问题,我只找到了2D的解决方案。
有一些解决方案可以在3D中找到从点到直线的距离,但不能到线段上,像这样:
(图片来自Calculate distance point to line segment with special cases)
这个答案是从这里改编而来:在Python中计算点数组到线段的欧几里得距离,无需使用for循环。
lineseg_dist
函数返回点p到线段[a,b]的距离。p
、a
和b
都是np.arrays。
import numpy as np
def lineseg_dist(p, a, b):
# normalized tangent vector
d = np.divide(b - a, np.linalg.norm(b - a))
# signed parallel distance components
s = np.dot(a - p, d)
t = np.dot(p - b, d)
# clamped parallel distance
h = np.maximum.reduce([s, t, 0])
# perpendicular distance component
c = np.cross(p - a, d)
return np.hypot(h, np.linalg.norm(c))
p, a, b
是数组的数组(即点的数组)。对于您的问题,您可能希望使用单个点集,这种情况下s
和t
将是标量 - 因此需要用0
替换np.zeros(len(p))
。如果您可以保证a
永远不等于b
,那么“np.all
”检查是不必要的。 - meowgoesthedog
np.zeros(...)
更改为0
就可以解决问题了(该答案中的解决方案处理并行测试的任意数量,因此s
和t
是标量的数组而不是单个标量)。 - meowgoesthedog