Кожна лінія повинна розділити площину на "всередину" та "контур"; це можна дізнатися, використовуючи звичайний метод внутрішнього продукту.
Перенесіть усі лінії на деяку відстань.
Розгляньте всі пари сусідніх ліній (лінії, а не відрізок лінії), знайдіть перетин. Це нова вершина.
Очистіть нову вершину, видаливши всі пересічні частини. - у нас тут є декілька випадків
(а) Випадок 1:
0--7 4--3
| | | |
| 6--5 |
| |
1--------2
якщо ви витратите їх на одиницю, ви отримали це:
0----a----3
| | |
| | |
| b |
| |
| |
1---------2
7 і 4 перекриваються .. якщо ви бачите це, ви видаляєте цю точку і всі точки між ними.
(b) випадок 2
0--7 4--3
| | | |
| 6--5 |
| |
1--------2
якщо ви витратите їх на два, ви отримали це:
0----47----3
| || |
| || |
| || |
| 56 |
| |
| |
| |
1----------2
Щоб вирішити це, для кожного сегмента рядка потрібно перевірити, чи він не перетинається з останніми сегментами.
(c) випадок 3
4--3
0--X9 | |
| 78 | |
| 6--5 |
| |
1--------2
витрати на 1. це більш загальний випадок для випадку 1.
(d) випадок 4
те саме, що і у випадку 3, але витрати на два.
Насправді, якщо ви можете вирішити випадок 4. Усі інші випадки - це лише окремий випадок, який перекривається певною лінією чи вершиною.
У випадку 4, ви зберігаєте стек вершин .. ви натискаєте, коли ви знаходите лінії, що перекриваються останнім рядком, з'являються, коли ви отримуєте останній рядок. - точно так, як ви робите у опуклому корпусі.