С вашего вопроса неясно, если вы ищете расстояние от сегмента или самого сегмента. Предполагая, что вы ищете расстояние (участок в той простой модификации, как только вы знаете, которые являются две точек, расстояние которых минимально), с учетом 5 точек, пронумерованных от 1 до 5, вам нужно
compare 1 with 2,3,4,5, then
compare 2, with 3,4,5, then
compare 3 with 4,5, then
compare 4 with 5.
Если я не ошибаюсь, учитывая коммутативность расстояния, вам не нужно выполнять другие сравнения. В питоне, может звучать как что-то
import numpy as np
def find_min_distance_of_a_cloud(cloud):
"""
Given a cloud of points in the n-dim space, provides the minimal distance.
:param cloud: list of nX1-d vectors, as ndarray.
:return:
"""
dist_min = None
for i, p_i in enumerate(cloud[:-1]):
new_dist_min = np.min([np.linalg.norm(p_i - p_j) for p_j in cloud[(i + 1):]])
if dist_min is None or dist_min > new_dist_min:
dist_min = new_dist_min
return dist_min
Это может быть проверено с чем-то вроде следующего кода:
from nose.tools import assert_equal
def test_find_min_distance_of_a_cloud_1pt():
cloud = [np.array((1, 1, 1)), np.array((0, 0, 0))]
min_out = find_min_distance_of_a_cloud(cloud)
assert_equal(min_out, np.sqrt(3))
def test_find_min_distance_of_a_cloud_5pt():
cloud = [np.array((0, 0, 0)),
np.array((1, 1, 0)),
np.array((2, 1, 4)),
np.array((3, 4, 4)),
np.array((5, 3, 4))]
min_out = find_min_distance_of_a_cloud(cloud)
assert_equal(min_out, np.sqrt(2))
Если более двух точек могут иметь один и то же минимальное расстояние, и вы ищете сегменты, вам нужно снова изменить предлагаемый код, а выход будет списком точек, расстояние которых минимально (или пару точек). Надеюсь, поможет!
Вы не объяснили, как найти dLRmin в O (n) времени, чтобы сделать весь алгоритм O (nlogn) time –