Python кратчайшее расстояние между точкой и отрезком в 3D и точкой пересечения на отрезке - PullRequest
0 голосов
/ 22 апреля 2020

Я ищу python реализацию кратчайшего расстояния между точкой и отрезком в 3D и точкой пересечения на отрезке

1 Ответ

0 голосов
/ 25 апреля 2020

Вот реализация, использующая 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, и обобщенного значения c балл p. Определим следующие величины

a

r

Общая c точка на отрезке с координатами:

x

Таким образом, расстояние от точки p до общей точки c на отрезке составляет:

d

Мы хотим минимизировать квадратное расстояние (мы используем квадратное расстояние, чтобы сделать вычисления немного легче)

dd

dd2

т.е.

ddt

Это дает нам значение t, которое минимизирует расстояние (фактически делает неподвижным).

enter image description here

Теперь нам нужно помнить, что мы ограничены t01, поэтому мы можем ограничить t.

Вычисление d(t_min) даст минимальное расстояние.

Расстояние будет нормой возвращенного d: np.linalg.norm(d) или, что эквивалентно, np.sqrt(d.dot(d)).

figure1

enter image description here

...