문제
여러 반평면(half-plane) \(a_i x + b_i y + c_i \le 0\) 의 공통 영역(볼록 다각형, 비거나 무한일 수 있음)을 구한다. 선형계획법의 실현가능영역, 로봇이 갈 수 있는 영역, 코어(core of polygon) 등에서 나온다. \(O(n\log n)\) 에 교집합 다각형을 구하는 표준 알고리즘이 있다.
반평면의 표현
각 반평면을 "방향 벡터를 따라 진행할 때 왼쪽이 허용 영역"인 유향 직선으로 표현한다. 직선을 점 \(p\) 와 방향 \(\vec{d}\) 로 두면, 점 \(q\) 가 허용되는 조건은 외적
$$ \vec{d} \times (q - p) \ge 0 $$
(즉 \(q\) 가 직선의 왼쪽). 모든 반평면을 이 규약으로 통일하는 것이 첫 단계다.
정렬 + 덱(deque) 스위프
- 모든 반평면을 편각(방향 벡터의 각도) 순으로 정렬한다.
- 같은 방향이면 더 안쪽(엄격한) 것만 남긴다(중복 제거).
- 정렬 순서대로 덱에 넣되, 새 반평면이 덱의 마지막 두 직선의 교점을 허용하지 않으면 마지막을 pop, 처음 두 직선의 교점을 허용하지 않으면 앞을 pop. 즉 볼록 껍질 구성과 닮은 양끝 정리.
- 모든 반평면을 처리한 뒤, 덱 앞쪽 직선들이 덱 마지막에 대해 불필요해지는 것도 한 번 더 정리한다.
남은 덱의 인접 직선 교점들이 교집합 다각형의 꼭짓점이다.
정확성 직관
편각 정렬은 경계 직선들이 다각형을 돌아가는 순서와 일치한다. 새 직선이 들어올 때, 그 직선이 "잘라내는" 쪽의 꼭짓점(이전 교점)들을 양 끝에서 제거하면, 항상 현재까지의 실현가능영역의 볼록 경계가 유지된다. 한 직선은 덱에 한 번 들어가고 많아야 한 번 나가므로 스위프가 \(O(n)\) (정렬이 지배적 \(O(n\log n)\)).
경계 사례
| 상황 | 처리 |
|---|---|
| 교집합이 빈 영역 | 덱이 모순(앞뒤가 서로를 배제) |
| 무한(비유계) 영역 | 매우 큰 경계 박스를 넣어 유계화 |
| 평행·중복 직선 | 더 안쪽만 유지 |
복잡도
정렬 \(O(n\log n)\) + 스위프 \(O(n)\). 결과 다각형 꼭짓점 수는 \(O(n)\).