Вот реализация, использующая 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
. Определим следующие величины
Общая c точка на отрезке с координатами:
Таким образом, расстояние от точки p
до общей точки c на отрезке составляет:
Мы хотим минимизировать квадратное расстояние (мы используем квадратное расстояние, чтобы сделать вычисления немного легче)
т.е.
Это дает нам значение t
, которое минимизирует расстояние (фактически делает неподвижным).
Теперь нам нужно помнить, что мы ограничены , поэтому мы можем ограничить t
.
Вычисление d(t_min)
даст минимальное расстояние.
Расстояние будет нормой возвращенного d
: np.linalg.norm(d)
или, что эквивалентно, np.sqrt(d.dot(d))
.