3D空间中点到线段的距离(Python)

5

我正在寻找一个Python函数,可以计算从3D点(x_0,y_0,z_0)到线段的距离,该线段由其端点(x_1,y_1,z_1)和(x_2,y_2,z_2)定义。

针对此问题,我只找到了2D的解决方案。

有一些解决方案可以在3D中找到从点到直线的距离,但不能到线段上,像这样: dist to segment

(图片来自Calculate distance point to line segment with special cases)


@meowgoesthedog,您提到的问题是关于一条直线而不是线段。 - Sanya Pushkar
可能是三维空间中点和直线之间的最短距离的重复问题。 - jose_bacoy
@meowgoesthedog 这是2D的,我需要3D。 - Sanya Pushkar
@âńōŋŷXmoůŜ 那个问题仅回答了一行的问题,而非一个片段的问题。 - Sanya Pushkar
1
为了以后的参考,请在描述问题时比“它返回一个错误”或“它不起作用”更具体。在这种情况下,我认为将np.zeros(...)更改为0就可以解决问题了(该答案中的解决方案处理并行测试的任意数量,因此st是标量的数组而不是单个标量)。 - meowgoesthedog
显示剩余4条评论
1个回答

5

这个答案是从这里改编而来:在Python中计算点数组到线段的欧几里得距离,无需使用for循环

lineseg_dist函数返回点p到线段[a,b]的距离。pab都是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))

2
请注意,p, a, b数组的数组(即点的数组)。对于您的问题,您可能希望使用单个点集,这种情况下st将是标量 - 因此需要用0替换np.zeros(len(p))。如果您可以保证a永远不等于b,那么“np.all”检查是不必要的。 - meowgoesthedog
1
@meowgoesthedog 是的,我忘记修改关于s和t的内容了。另外,据我所知,np.all检查a和b是否沿着相同的轴,我不确定你是否需要替换为np.array_equal。 - Sanya Pushkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接