Пересечение многоугольников
Два многоугольника на плоскости заданы координатами своих вершин.
Требуется вычислить площадь пересечения этих многоугольников, то есть
сумму площадей тех кусков, которые образуются при их пересечении и
принадлежат каждому из них. При этом вы можете предполагать, что:
А) Многоугольники выпуклые, а координаты их вершин даны в произвольном
порядке.
Б) Хотя бы один из многоугольников невыпуклый, но известно, что у каждого
из многоугольников не более одного угла, большего 180 градусов, а координаты
вершин даны в порядке обхода по часовой стрелке.
Ваша программа по входным данным должна сама определить, какой из этих
двух случаев имеет место.
Входные данные
Первая строка входного файла содержит целое число N – количество вершин в
первом многоугольнике (3 ≤ N ≤ 50). Во второй строке записаны координаты
этих вершин. Третья и четвертая строки таким же образом задают второй
многоугольник. Координаты всех вершин являются целыми числами из
диапазона [-32768, 32767].
Выходные данные
Выведите в выходной файл искомую площадь не менее чем с 6 верными
значащими цифрами.
Пример входного файла
3
0 3 0 -3 -3 0
5
-1 1 2 1 1 0 2 -1 -1 -1
Пример выходного файла
2.0
Решение
Отсортируем вершины каждого из многоугольников по полярному углу
относительно его центра масс. Если в результате получились два выпуклых
многоугольника (для проверки выпуклости используйте критерий из задачи 4.1),
значит нам предстоит решать пункт А, иначе – пункт Б.
Разберем пункт А. Очевидно, что пересечение двух выпуклых
многоугольников также является выпуклым многоугольником. Какие точки
будут его вершинами? Во-первых, все точки пересечения двух
многоугольников. Чтобы их найти, нужно пересечь все стороны одного
многоугольника со всеми сторонами другого. Во-вторых, все вершины первого
многоугольника, принадлежащие второму, и наоборот, все вершины второго,
принадлежащие первому. Определив все вершины пересечения, упорядочим их,
отсортировав по полярному углу относительно центра масс. Далее считаем
площадь получившегося многоугольника.
Пункт Б сводится к пункту А следующим образом. Прямая, проведенная
через любую из сторон угла, большего 180 градусов, разбивает невыпуклый
многоугольник на два выпуклых. Пересекая получившиеся выпуклые
многоугольники (как в пункте А) и суммируя площади их пересечений, найдем
ответ на пункт Б.