Я нашел другое решение, чем алгоритм развертки.
Поскольку все ваши прямоугольники размещены прямоугольными, горизонтальные и вертикальные линии прямоугольников будут образовывать прямоугольную неправильную сетку. Вы можете «нарисовать» прямоугольники на этой сетке; Это означает, что вы можете определить, какие поля сетки будут заполнены. Поскольку линии сетки формируются из границ данных прямоугольников, поле в этой сетке всегда будет либо полностью пустым, либо полностью заполненным прямоугольником.
Мне пришлось решить проблему в Java, поэтому вот мое решение: http://pastebin.com/03mss8yf
Эта функция вычисляет всю площадь, занимаемую прямоугольниками. Если вас интересует только часть с перекрытием, вы должны расширить блок кода между строками 70 и 72. Возможно, вы можете использовать второй набор для хранения полей сетки, которые используются более одного раза. Ваш код между строками 70 и 72 должен быть заменен на блок вроде:
GridLocation gl = new GridLocation(curX, curY);
if(usedLocations.contains(gl) && usedLocations2.add(gl)) {
ret += width*height;
} else {
usedLocations.add(gl);
}
Здесь используется переменная usedLocations2 того же типа, что и usedLocations; это будет построено
в той же точке.
Я не очень знаком с вычислениями сложности; поэтому я не знаю, какое из двух решений (развертка или мое сеточное решение) будет работать / масштабироваться лучше.