Этот ответ адаптирован отсюда: Вычислить евклидово расстояние между массивом точек до отрезка линии в 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))