Так как вы заявили, что прямоугольники могут быть не выровнены, возможными ответами могут быть ничего, точка, отрезок или многоугольник с 3-8 сторонами.
Обычный способ сделать это 2d boolean
операция состоит в том, чтобы выбрать упорядочение ребер против часовой стрелки, а затем оценить сегменты ребер между критическими точками (пересечениями или углами).На каждом перекрестке вы переключаетесь между краевым сегментом первого прямоугольника на ребро второго или наоборот.Вы всегда выбираете сегмент слева от предыдущего сегмента.
Существует много деталей, но основной алгоритм состоит в том, чтобы найти все пересечения и расположить их по краям с помощьюсоответствующая структура данных.Выберите пересечение (если оно есть) и выберите отрезок, ведущий от этого пересечения.Найдите сегмент другого прямоугольника слева от выбранного начального сегмента.На рисунке мы выбираем зеленый сегмент на пересечении a (в направлении, указанном стрелкой) в качестве контрольного сегмента.Сегмент другого прямоугольника, который находится справа, является сегментом от a до b .Используйте это как следующий ссылочный сегмент и выберите зеленый сегмент слева от него.Это сегмент от b до c .Найти сегмент cd таким же образом.Следующий сегмент от d до угла, поэтому угол находится в списке вершин и для пересечения.Из кукурузы мы возвращаемся к a .
Чтобы выбрать левую сторону каждый раз, вы используете определитель координат векторов направления для встречающихся ребер.Если определитель для упорядоченной пары направленных ребер положительный, вы идете правильным путем.
Теперь, когда у вас есть вершины многоугольника пересечения, вы можете использовать формулу геодезиста ., чтобы получить площадь.
Некоторые детали, которые я оставляю вам:
Что, если угол совпадает сребро или вершина другого треугольника?
Что если пересечений нет?(один прямоугольник находится внутри другого, или они не пересекаются - вы можете использовать проверку точки в многоугольнике, чтобы выяснить это. См. статью Википедии о многоугольниках .
Что если пересечение представляет собой одну точку или отрезок?