Каждая линия должна разбивать плоскость на «внутрь» и «контур»; Вы можете узнать это, используя обычный метод внутреннего продукта.
Переместить все линии наружу на некоторое расстояние.
Рассмотрим все пары соседних линий (линии, а не отрезок), найдите пересечение. Это новая вершина.
Очистите новую вершину, удалив все пересекающиеся части. - у нас есть несколько случаев здесь
(а) Дело 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, вы сохраняете стек вершин. Вы нажимаете, когда обнаруживаете, что линии перекрываются с последней, и выталкиваете его, когда получаете последнюю строку. - так же, как вы делаете в выпуклой оболочке.