У меня есть две траектории (т.е. два списка точек), и я пытаюсь найти точки пересечения для обеих этих траекторий. Однако, если я представлю эти траектории в виде линий, я могу пропустить пересечения в реальном мире (просто промахнусь).
Что я хотел бы сделать, так это представить линию как многоугольник с определенной шириной вокруг точек, а затем найти, где два многоугольника пересекаются друг с другом.
Я использую пространственную библиотеку python, но мне было интересно, делал ли кто-нибудь это раньше. Вот изображение сегментов линии, которые не пересекаются, потому что они просто не пересекаются друг с другом. Ниже приведен пример кода данных, который представляет траекторию двух объектов.


object_trajectory=np.array([[-3370.00427248, 3701.46800775],
[-3363.69164715, 3702.21408203],
[-3356.31277271, 3703.06477984],
[-3347.25951787, 3704.10740164],
[-3336.739511 , 3705.3958357 ],
[-3326.29355823, 3706.78035903],
[-3313.4987339 , 3708.2076586 ],
[-3299.53433345, 3709.72507366],
[-3283.15486406, 3711.47077376],
[-3269.23487255, 3713.05635557]])
target_trajectory=np.array([[-3384.99966703, 3696.41922372],
[-3382.43687562, 3696.6739521 ],
[-3378.22995178, 3697.08802862],
[-3371.98983789, 3697.71490469],
[-3363.5900481 , 3698.62666805],
[-3354.28520354, 3699.67613798],
[-3342.18581931, 3701.04853915],
[-3328.51519511, 3702.57528111],
[-3312.09691577, 3704.41961271],
[-3297.85543763, 3706.00878621]])
plt.plot(object_trajectory[:,0],object_trajectory[:,1],'b',color='b')
plt.plot(vehicle_trajectory[:,0],vehicle_trajectory[:,1],'b',color='r')
Ответ 1 · рейтинг 1 · Jeremy McGibbon
Допустим, у вас есть две строки, определенные массивами numpy x1, y1, x2 и y2.
import numpy as np
Вы можете создать массив distances[i, j], содержащий расстояния между i точкой первой строки и j точкой второй строки.
distances = ((x1[:, None] - x2[None, :])**2 + (y1[:, None] - y2[None, :])**2)**0.5
Затем вы можете найти индексы, где distances меньше некоторого порога, который вы хотите определить для пересечения. Если вы считаете, что линии имеют некоторую толщину, порог будет равен половине этой толщины.
threshold = 0.1
intersections = np.argwhere(distances < threshold)
intersections теперь представляет собой массив N на 2, содержащий все пары точек, которые считаются "пересекающимися" ([i, 0] - это индекс из первой строки, а [i, 1] - это индекс из второй строки). Если вы хотите получить набор всех индексов из каждой пересекающейся строки, вы можете использовать что-то вроде
first_intersection_indices = np.asarray(sorted(set(intersections[:, 0])))
second_intersection_indices = np.asarray(sorted(set(intersections[:, 1])))
Отсюда вы также можете определить количество пересечений, взяв только центральное значение для любых последовательных значений в каждом списке.
L1 = []
current_intersection = []
for i in range(first_intersection_indices.shape[0]):
if len(current_intersection) == 0:
current_intersection.append(first_intersection_indices[i])
elif first_intersection_indices[i] == current_intersection[-1]:
current_intersection.append(first_intersection_indices[i])
else:
L1.append(int(np.median(current_intersection)))
current_intersection = [first_intersection_indices[i]]
print(len(L1))
Вы можете использовать их для печати координат каждого перекрестка.
for i in L1:
print(x1[i], y1[i])