Мне дали упражнение, к сожалению, я сам не справился.
Существует множество прямоугольников и прямоугольник R 0 . Используя алгоритм подметания плоскости, определите, полностью ли покрыто R 0 набором R 1 . , R n .
Более подробную информацию о принципе алгоритмов стреловидной линии смотрите здесь .
Начнем с самого начала. Изначально мы знаем алгоритм строчной линии как алгоритм для поиска пересечений отрезков, который требует двух структур данных:
- набор точек событий (он хранит конечные точки сегментов и точек пересечений)
- состояние (динамическая структура для множества сегментов, пересекающих линию развертки)
Общая идея: предположим, что линия развертки - это вертикальная линия, которая начинает приближаться к набору прямоугольников слева. Сортируйте все координаты x прямоугольников и сохраняйте их в Q в возрастающем порядке - нужно взять O ( n log n ) . Начните с первой точки события, для каждой точки определите набор прямоугольников, которые пересекаются с заданной координатой x , идентифицируйте непрерывные сегменты прямоугольников пересечения и проверьте, полностью ли они покрывают R 0 в текущей координате x . С T в качестве двоичного дерева это займет O ( журнал . Если какая-либо часть R 0 остается открытой, то R 0 не полностью покрыта.
Детали: Идея алгоритма пересечения сегментов заключалась в том, что пересекаются только смежные сегменты. Основываясь на этом факте, мы создали статус и поддерживали его в течение всего алгоритма. Я попытался найти аналогичную идею в этом случае, и пока безуспешно, единственное, что я могу сказать, это то, что два прямоугольника пересекаются, если их соответствующие координаты x и y перекрываются.
Ответы:
В общем случае очевидный трюк не такой быстрый. Используйте стандартный алгоритм линии развертки, чтобы вычислить все плоское подразделение, индуцированное прямоугольниками.
источник