Lesson CCW와 외적 — 방향·넓이·교차의 원리
어떤 문제를 푸는가
평면 위 세 점 \(A, B, C\)가 주어졌을 때 이들이 반시계(CCW)·시계(CW)·일직선(collinear) 중
어느 배치인지, 나아가 두 선분이 교차하는지 를 판정합니다. CCW(counter-clockwise) 판정은
계산 기하의 가장 기본 원자 연산으로, 볼록 껍질·다각형 포함 판정·선분 교차·각도 정렬 등
사실상 모든 기하 알고리즘이 이 하나 위에 세워집니다.
- 입력이 좌표(점·선분) 이고 "방향", "교차", "왼쪽/오른쪽", "내부/외부"를 물으면 CCW를 떠올립니다.
- 핵심 도구는 외적(cross product) 한 번. 나눗셈·기울기·삼각함수 없이 부호만으로 판정합니다.
CCW — 부호 있는 외적
벡터 \(\vec{AB}=(B-A)\)와 \(\vec{AC}=(C-A)\)의 2차원 외적을 정의합니다.
$$ \operatorname{ccw}(A,B,C)=(B_x-A_x)(C_y-A_y)-(B_y-A_y)(C_x-A_x) $$
| 부호 | 기하적 의미 |
|---|---|
| \(>0\) | \(A\to B\to C\)가 반시계(좌회전), \(C\)는 \(\vec{AB}\)의 왼쪽 |
| \(<0\) | 시계(우회전), \(C\)는 \(\vec{AB}\)의 오른쪽 |
| \(=0\) | 세 점이 한 직선 위(공선) |
이 값의 절댓값 \(|\operatorname{ccw}(A,B,C)|\)은 삼각형 \(ABC\) 넓이의 2배 입니다. 즉 하나의 정수
연산이 방향(부호) 과 넓이(크기) 를 동시에 담습니다.
왜 부호가 방향을 결정하는가
외적은 두 벡터가 만드는 평행사변형의 부호 있는 넓이 입니다. 오른손 좌표계에서 \(\vec{AC}\)가
\(\vec{AB}\)를 기준으로 왼쪽으로 벌어지면 양의 넓이, 오른쪽이면 음의 넓이가 됩니다. "회전 방향"이
곧 "왼쪽에 있는가 오른쪽에 있는가"이므로, 외적 부호 하나로 회전 방향이 완전히 결정됩니다.
기울기 \(\frac{C_y-A_y}{C_x-A_x}\)를 비교하는 방식은 수직선에서 분모가 0이 되고 부동소수 오차가
끼지만, 외적은 곱셈·뺄셈뿐이라 정수 입력이면 완전히 정확 합니다.
선분 교차의 원리
선분 \(\overline{AB}\)와 \(\overline{CD}\)가 만나려면 두 조건이 동시에 성립해야 합니다.
- \(C\)와 \(D\)가 직선 \(AB\)의 서로 반대편:
\(\operatorname{ccw}(A,B,C)\)와 \(\operatorname{ccw}(A,B,D)\)의 부호가 다르다. - \(A\)와 \(B\)가 직선 \(CD\)의 서로 반대편:
\(\operatorname{ccw}(C,D,A)\)와 \(\operatorname{ccw}(C,D,B)\)의 부호가 다르다.
$$ \operatorname{ccw}(A,B,C)\cdot\operatorname{ccw}(A,B,D)<0 \;\land\; \operatorname{ccw}(C,D,A)\cdot\operatorname{ccw}(C,D,B)<0 $$
두 조건이 모두 참이면 두 선분은 내부에서 가로질러 만납니다.
예시. \(A(0,0),B(4,4),C(0,4),D(4,0)\)이면 두 대각선이 \((2,2)\)에서 교차합니다.
\(\operatorname{ccw}(A,B,C)=16>0\), \(\operatorname{ccw}(A,B,D)=-16<0\)로 부호가 엇갈리고,
반대쪽도 마찬가지라 교차가 확인됩니다.
까다로운 경계 — 끝점 닿음과 공선
위 곱이 \(0\)이 되는 순간(어떤 \(\operatorname{ccw}=0\), 즉 세 점 공선)은 별도 처리해야 합니다.
- 끝점이 다른 선분 위에 닿는 경우(예: \(C\)가 \(\overline{AB}\) 내부에 위치).
- 두 선분이 같은 직선 위 에서 일부 구간을 겹치는 경우.
이 경우는 부호만으로는 알 수 없고, 좌표 구간이 겹치는지(1차원 겹침)를 추가로 봐야 합니다.
이 경계 처리를 빠뜨리는 것이 이 단원 오답의 단골 원인입니다. 구체적 판정식은 2강에서 다룹니다.
복잡도와 핵심 직관
CCW 한 번은 \(O(1)\), 선분 교차 판정도 \(O(1)\)입니다. 복잡한 기하 판정이 결국 외적 부호 몇 개의
조합 으로 환원된다는 점, 그리고 정수로 계산하면 오차가 아예 없다는 점이 이 단원의 두 가지 핵심
교훈입니다. 다음 강의에서 오버플로 없이 안전하게 구현합니다.