Требования:
Учитывая кучу отрезков в 2D-плоскости, мне нужно объединить все те, которые похожи или равны друг другу.
Например, если мне дали два отрезка (0, 0) - (1, 1)
и (1, 1) - (2, 2)
. Эти две линии связаны и имеют одинаковый наклон. Таким образом, я могу просто объединить эти два в одну строку (0, 0) - (2, 2)
Для отрезков (0, 0) - (1, 1)
и (1.01, 1) - (2, 2)
. Несмотря на то, что их наклоны немного отличаются и они не связаны, это не так хорошо видно человеческим глазам, поэтому я все равно слил бы эти два в (0, 0) - (2, 2)
в обмен на производительность.
Для отрезков (0, 0) - (1, 1)
и (0.5, 0.5) - (0.6, 0.6)
. Последнее является лишь частью первого, поэтому можно просто удалить последнее и сохранить только первое.
Очевидно, я могу сделать это жестоким способом O(n^2)
но это занимает слишком много времени. Есть ли хороший алгоритм / структура данных, которая может помочь сократить время выполнения?
Попытка:
Дерево диапазона: это выглядит как естественное соответствие, поскольку оно поддерживает запрос диапазона (линии с одинаковым наклоном). Однако вставка / удаление не поддерживаются.
R-дерево: R-дерево поддерживает запросы к элементам, которые находятся рядом с помощью прямоугольника. Используя это, я мог сначала найти все линии, которые находятся внутри ограниченного прямоугольника, и отфильтровать те, которые имеют разность наклона> epsilon или distance> epsilon2. Однако я не могу найти хорошее описание реализации (поиск выглядит хорошо документированным, но вставка / удаление очень расплывчаты)
B tree: B tree выглядит многообещающе, но, похоже, мой вариант использования не является его основным использованием. Не уверен, что это будет правильный путь.