Мне нужен алгоритм, который принимает несортированный массив выровненных по оси прямоугольников и возвращает любую пару прямоугольников, перекрывающихся
Каждый прямоугольник имеет две переменные, координаты верхнего левого угла и нижний правый угол
Мне нужен алгоритм, который принимает несортированный массив выровненных по оси прямоугольников и возвращает любую пару прямоугольников, перекрывающихся
Каждый прямоугольник имеет две переменные, координаты верхнего левого угла и нижний правый угол
Это может быть немного сложно для собеседования, зависит от того, какая работа, Это геометрический алгоритм вычисления алгоритма,
Ответ можно найти здесь: http://www.cs.princeton.edu/~rs/AlgsDS07/17GeometricSearch.pdf
Ниже приведено краткое описание алгоритма пересечения, представленного в ссылке DuduAlul.
Для решения требуется использование дерева поиска, способного выполнять запросы диапазона. Запрос диапазона запрашивает все элементы со значениями между K1 и K2 и должен быть операцией O (R + log N), где N - общее количество элементов дерева, а R - количество результатов.
В алгоритме используется подход развертки:
1) Сортировка всех левых и правых краев прямоугольника в соответствии с их значением X в список L.
2) Создайте новое дерево поиска пустого диапазона T, для Y-упорядочения прямоугольных вершин/дно
3) Создайте новый пустой набор результатов RS уникальных пар прямоугольников
4) Траверс L в порядке возрастания. Для всех V в L:
Если visRightEdge()
T.remove(V.rectangle.top)
T.remove(V.rectangle.bottom)
остальное
Для всех U в T.getRange(V.rectangle.top, V.rectangle.bottom)
RS <
T.add(V.rectangle.top)
T.add(V.rectangle.bottom)
5) вернуть RS
Сложность времени - O (R + N log N), где R - фактическое число пересечений.
- EDIT -
Я только выяснил, что решение не совсем правильно - тест пересечения в дереве T пропускает некоторые случаи. Дерево должно поддерживать Y-интервалы, а не Y, и в идеале это должно быть Дерево интервала.
Обтекание и обрезка - это метод, в котором много физических движков решают эту проблему.
Там хорошее объяснение в Дэвид Барафф SIGGRAPH отмечает в разделе 7.2 Ограничивающие коробки.