繁体   English   中英

Python 3D 中点与线段与线段上交点的最短距离

[英]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))

解释


给定一个段,由两个点xaxb以及一个通用点p标识。 我们定义以下数量

一个

r

线段上的通用点具有坐标:

X

所以点p到线段上一个通用点的距离是:

d

我们希望最小化平方距离(我们使用平方距离使计算更容易一些)

dd

dd2

IE

滴滴涕

这为我们提供了使距离最小化的t值(实际上是静止的)。

在此处输入图像描述

现在我们需要记住,我们必须保持t01 ,所以我们可以钳制t

计算d(t_min)将给出最小距离。

距离将是返回的d的范数: np.linalg.norm(d)或等效的np.sqrt(d.dot(d))

图1

在此处输入图像描述

我建议使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM