계산기하의 기본 중의 기본이라고 할 수 있는 CCW 에 대해 알아보고자 한다.
CCW는 Counter ClockWise (반시계) 의 줄임말으로, 점 3개에 대한 방향성 관계를 알 수 있는 수치다.
그림으로 보면,
세 점 A, B, C 가 2차원 좌표평면에 있다고 하자.
반직선 AB 에 대하여 점 C가 왼쪽에 있는지, 일직선 상에 있는지, 오른쪽에 있는지 어떻게 알 수 있을까?
간단한 선형대수학 내용을 알아보자.
위처럼 2×2 행렬 A가 있다고 해보자.
이 행렬 A의 행렬식 det(A) 는 아래와 같이 정의된다. det(A) 도 되고 |A| 도 맞는 표현이다.
두 대각선 원소들의 곱을 빼면 det(A)가 되는 것이다. ad < bc 라면 det(A)는 얼마든지 음수가 될 수 있다.
그렇다면, 3×3 행렬의 행렬식은 어떻게 정의될까?
위처럼 3×3 행렬 B 가 있다고 해보자.
그림에서 볼 수 있듯 1행의 원소들 a, b, c 위에는 각각 +, -, + 가 번갈아서 그려져 있다.
우선, B의 행렬식 공식을 보자.
이 공식에서 a, b, c의 부호가 +, -, + 인 것을 알 수 있다.
그렇다면, a, b, c 각각에 곱해진 2×2 행렬은 어떻게 나온 것일까?
b 의 입장에서 생각해보면, 행과 열이 b 와 아예 겹치지 않는 4개의 원소가 나온다.
(위 그림에서는 색칠되지 않은 원소들)
이 원소들은 2×2 행렬을 자연스럽게 이루게 되고, 이는 행렬식 공식에서 b 옆에 있는 행렬과 같음을 알 수 있다.
이제 3차원 행렬식을 알게 되었으니 맨 처음 A, B, C 그림으로 돌아가서 CCW 를 알아보자.
우선 이 행렬에서 i , j, k 는 x축, y축, z축 의 단위벡터를 의미한다.
즉 i 는 (1, 0, 0), j 는 (0, 1, 0), k 는 (0, 0, 1) 이 된다.
3×3 행렬의 1행은 i, j, k 가 차례대로 들어간다.
2행은 벡터 AB, 즉 (x2 - x1, y2 - y1, 0) 이 들어간다.
3행은 벡터 AC, 즉 (x3 - x1, y3 - y1, 0) 이 들어간다.
이제 아까의 공식을 이용하여 이 3×3 행렬의 행렬식을 구하면 아래와 같다.
i 와 j 에 관련된 2×2 행렬은 그 행렬식이 0 이 나오기 때문에, k 에 관련된 2×2 행렬의 행렬식만 살아남는다.
즉, 우리는 위 식에서 k 의 계수가 양수인지, 음수인지만 따져주면 된다.
최종으로 정리하면,
위 식의 값에 따라 C 가 반직선 AB의 왼쪽인지, 일직선 상에 있는지, 오른쪽에 있는지 확인할 수 있다.
0보다 크다면 (반시계) : AC 는 AB 에 대해 반시계 방향으로 돌아가 있다. (왼쪽)
0 이라면 (일직선) : C 는 직선 AB 위에 놓여 있다.
0보다 작다면 (시계) : AC 는 AB에 대해 시계 방향으로 돌아가 있다. (오른쪽)
'Algorithm' 카테고리의 다른 글
Mo's Algorithm (0) | 2022.08.29 |
---|---|
Set 와 PBDS (0) | 2022.08.25 |
Trie 자료구조 (0) | 2022.08.24 |
KMP 알고리즘 : 문자열 검색 (0) | 2022.08.19 |
Failure Function (0) | 2022.08.19 |
댓글