ОК, я задал достаточно вопросов, вот что-то из ответа ...
Если данные представлены в виде растра, алгоритм тривиален:
- Создать логический массив, представляющий прямоугольник модели (т.е. синий). Установите для всех элементов значение FALSE (представляющее «не покрыто»)
- Для каждого красного прямоугольника (игнорируйте те, которые не могут перекрывать синий), установите все элементы массива на ИСТИНА, если они находятся внутри красного прямоугольника.
- Наконец, проверьте, установлен ли каждый элемент массива в значение ИСТИНА.
Если данные векторные, это немного сложнее. Сначала определите функцию, которая возвращает прямоугольник, представляющий пересечение (если есть) двух прямоугольников. Это просто Затем продолжите:
- Создайте переменную с именем UnCoveredRectangle, которая инициализируется так же, как синий прямоугольник.
Опять же, беспокойтесь только о красных прямоугольниках, которые пересекают синий. Для каждого красного прямоугольника вычислите пересечение прямоугольника с UnCoveredRectangle. Пересечение приведет к одной из следующих ситуаций:
2.1 Пересечение равно UnCoveredRectangle. Работа завершена.
2.2 Пересечение «кусает» прямоугольный кусок из CoveredRectangle. Оставшийся UnCoveredRectangle будет либо прямоугольником, либо L-образным, либо U-образным. Если это сам прямоугольник, установите UnCoveredRectangle в качестве оставшегося прямоугольника и перейдите к шагу 2. Если UnCoveredRectangle имеет L- или U-образную форму, разделите его на 2 или 3 прямоугольника и выполните возврат из шага 2 ..
Если у вас закончились красные прямоугольники до того, как область (часть) UnCoveredRectangle будет отправлена в 0, вы закончили.
ОК. Я не имею ни малейшего представления о сложности этого алгоритма, но если количество прямоугольников не слишком велико, я не слишком обеспокоен, хотя, возможно, @den так и есть. И я опустил много деталей. И я не могу нарисовать хорошие диаграммы, как @den, поэтому вам придется нарисовать их для себя.