기하에서 좌표를 다룰 때 각 점 또는 선분의 상대적인 위치를 구하는 것은 아주 중요하다.
이 작은 연산을 토대로 여러 가지 작업을 할 수 있기 때문인데, 먼저 선분과 점의 상대적인 위치를 구하는 ccw에 대해서 알아보고 이를 어디에 적용할 수 있는지 보자.
CCW란 임의의 선분을 기준으로 하나의 점이 시계방향에 있는지, 반시계방향에 있는지 확인하는 수단이다.
그림으로 보면 가운데 선분을 기준으로 위의 점은 반시계 방향, 아래 점은 시계 방향임을 알 수 있다.
그럼 이제 각 선분을 벡터라고 보고 외적의 개념을 떠올려보자.
두 벡터를 외적하면 방향이 두 벡터에 수직이며 크기는 두 벡터를 변으로 갖는 평행사변형의 넓이를 갖는 벡터가 나온다.
첫 번째 그림의 외적 $\vec{a} \times \vec{b}$ 의 방향은 오른손 법칙에 의해 모니터를 뚫고 나오는 방향이고, 두 번째 그림의 외적 $\vec{a} \times \vec{b}$은 그 반대방향이 된다.
외적의 크기와 방향을 알았으면 식으로 정리해보자.
위와 같이 2차원 좌표평면에 점들이 주어질 때 외적은 다음과 같다.
$$\vec{a} \times \vec{b} = (0,\ 0,\ x_1y_2+x_2y_3+x_3y_1-(y_1x_2+y_2x_3+y_3x_1))$$
여기서 z축 좌표의 부호에 따라 두 벡터 $\vec{a}$, $\vec{b}$의 상대적인 위치를 알 수 있다.
- z = 0: 일직선
- z > 0: 시계방향
- z < 0: 반시계방향
이 간단한 세 점의 방향을 알아내는 ccw를 가지고 많은 의미 있는 결과를 낼 수 있다. 두 선분이 겹치는지 확인하거나 모든 점을 포함하는 블록 다각형을 구하는 등 많은 기하 문제에 있어서 가장 기본적인 연산이라고 할 수 있다.
'알고리즘' 카테고리의 다른 글
모듈러 나눗셈 (0) | 2019.10.17 |
---|---|
이분 매칭 (Bipartite graph) (0) | 2019.10.17 |
스킵 리스트 (skip list) 동작 방법 (0) | 2019.10.17 |
Union-Find의 최적화 과정 (0) | 2019.10.16 |
피보나치 수열을 구하는 효율적인 방법 (0) | 2019.10.14 |
댓글