Каждая линия должна разбивать плоскость на «внутрь» и «контур»; Вы можете узнать это, используя обычный метод внутреннего продукта.
Переместите все линии наружу на некоторое расстояние.
Рассмотрим всю пару соседних линий (линии, а не отрезок), найдите пересечение. Это новая вершина.
Очистите новую вершину, удалив все пересекающиеся части. - у нас есть несколько случаев здесь
(а) Случай 1:
0--7 4--3
| | | |
| 6--5 |
| |
1--------2
если вы потратите его на одного, вы получите это:
0----a----3
| | |
| | |
| b |
| |
| |
1---------2
7 и 4 перекрываются .. если вы видите это, вы удаляете эту точку и все точки между ними.
(б) дело 2
0--7 4--3
| | | |
| 6--5 |
| |
1--------2
если вы потратите его на два, вы получите это:
0----47----3
| || |
| || |
| || |
| 56 |
| |
| |
| |
1----------2
Чтобы решить эту проблему, для каждого сегмента линии необходимо проверить, не перекрываются ли они с последними сегментами.
(в) дело 3
4--3
0--X9 | |
| 78 | |
| 6--5 |
| |
1--------2
Расход на 1. Это более общий случай для случая 1.
(d) дело 4
так же, как case3, но расход на два.
На самом деле, если вы можете обработать случай 4. Все другие случаи - это просто особый случай с некоторым перекрытием линий или вершин.
Для случая 4 вы сохраняете стек вершин. Вы нажимаете, когда обнаруживаете, что линии перекрываются с последней, и выталкиваете его, когда получаете последнюю строку. - так же, как то, что вы делаете в выпуклой оболочке.