各線は、平面を「内側」と「輪郭」に分割する必要があります。これは、通常の内積法を使用して見つけることができます。
すべての線を少し外側に移動します。
隣接する線のすべてのペア(線分ではなく線)を考慮して、交点を見つけます。これらは新しい頂点です。
交差するパーツを削除して、新しい頂点をクリーンアップします。-ここにいくつかのケースがあります
(a)ケース1:
0--7 4--3
| | | |
| 6--5 |
| |
1--------2
あなたがそれを1つ使うならば、あなたはこれを手に入れました:
0----a----3
| | |
| | |
| b |
| |
| |
1---------2
7と4が重なっています。これが表示された場合は、このポイントとその間のすべてのポイントを削除します。
(b)ケース2
0--7 4--3
| | | |
| 6--5 |
| |
1--------2
あなたがそれを2つ使うならば、あなたはこれを手に入れました:
0----47----3
| || |
| || |
| || |
| 56 |
| |
| |
| |
1----------2
これを解決するには、線の各セグメントについて、それが後のセグメントと重なっているかどうかを確認する必要があります。
(c)ケース3
4--3
0--X9 | |
| 78 | |
| 6--5 |
| |
1--------2
1ずつ消費します。これは、ケース1のより一般的なケースです。
(d)ケース4
case3と同じですが、2つ消費します。
実際、ケース4を処理できる場合、他のすべてのケースは、線または頂点が重なっている特殊なケースです。
ケース4を実行するには、頂点のスタックを保持します。後者の行と重なっている行を見つけたらプッシュし、後者の行を取得したらポップします。-凸包で行うのと同じように。