어떤 문제를 푸는가
세 점이 주어졌을 때 반시계/시계/일직선 중 어느 방향으로 도는지, 그리고 두
선분이 교차하는지 를 판정합니다. 컴퓨터 기하의 가장 기본 도구로, 볼록
껍질·다각형 포함 판정·선분 교차 등 거의 모든 기하 알고리즘의 토대입니다.
CCW — 외적(cross product)
점 \(A, B, C\)에 대해 벡터 \(\vec{AB}\)와 \(\vec{AC}\)의 외적의 부호를 봅니다.
$$ \text{ccw}(A, B, C) = (B_x - A_x)(C_y - A_y) - (B_y - A_y)(C_x - A_x) $$
| 부호 | 의미 |
|---|---|
| 양수 (> 0) | 반시계 방향(좌회전) |
| 음수 (< 0) | 시계 방향(우회전) |
| 0 | 세 점이 한 직선 위 |
이 값의 절댓값은 삼각형 \(ABC\) 넓이의 2배이기도 합니다. 즉 부호는 방향,
크기는 넓이를 동시에 담고 있습니다.
왜 부호가 방향을 주는가
외적은 두 벡터가 이루는 평행사변형의 부호 있는 넓이 입니다. \(\vec{AC}\)가
\(\vec{AB}\)의 왼쪽 에 있으면 양수, 오른쪽 이면 음수입니다. 회전
방향이 곧 "왼쪽/오른쪽에 있는가"이므로, 외적 부호 하나로 방향이 결정됩니다.
선분 교차 판정의 원리
선분 \(\overline{AB}\)와 \(\overline{CD}\)가 교차하려면:
- \(A, B\) 입장에서 \(C\)와 \(D\)가 서로 반대편 에 있어야 한다:
\(\text{ccw}(A, B, C)\)와 \(\text{ccw}(A, B, D)\)의 부호가 다르다. - 동시에 \(C, D\) 입장에서 \(A\)와 \(B\)도 서로 반대편이어야 한다.
두 조건이 모두 성립하면 교차합니다. 즉
$$ \text{ccw}(A,B,C)\cdot\text{ccw}(A,B,D) < 0 \quad\text{및}\quad \text{ccw}(C,D,A)\cdot\text{ccw}(C,D,B) < 0 $$
까다로운 경계 — 일직선/끝점 닿음
위 곱이 0이 되는 경우(어떤 ccw가 0 = 세 점 일직선)는 별도 처리해야 합니다.
한 선분의 끝점이 다른 선분 위에 닿거나, 두 선분이 일부 겹치는 경우입니다.
이때는 구간 겹침 검사(좌표 범위가 겹치는지)를 추가합니다.
핵심 직관
복잡해 보이는 기하 판정이 결국 외적 부호 몇 개의 조합 으로 환원됩니다.
나눗셈이나 기울기를 쓰지 않아 0으로 나누기·부동소수 오차를 피할 수 있다는
점도 큰 장점입니다. 다음 강의에서 정수 안전 구현과 경계 처리를 봅니다.