본문 바로가기
Algorithm

CCW 에 대하여

by Daisylum 2022. 8. 25.

계산기하의 기본 중의 기본이라고 할 수 있는 CCW 에 대해 알아보고자 한다.

CCW는 Counter ClockWise (반시계) 의 줄임말으로, 점 3개에 대한 방향성 관계를 알 수 있는 수치다.

 

그림으로 보면,

벡터 AC는 벡터 AB 에 대해 시계방향으로 돌아가있다.

 

세 점 A, B, C 가 2차원 좌표평면에 있다고 하자.

반직선 AB 에 대하여 점 C가 왼쪽에 있는지, 일직선 상에 있는지, 오른쪽에 있는지 어떻게 알 수 있을까?

 

간단한 선형대수학 내용을 알아보자.

2x2 행렬 A

 

위처럼 2×2 행렬 A가 있다고 해보자.

이 행렬 A의 행렬식 det(A) 는 아래와 같이 정의된다.  det(A) 도 되고 |A| 도 맞는 표현이다.

A의 행렬식

 

두 대각선 원소들의 곱을 빼면 det(A)가 되는 것이다. ad < bc 라면 det(A)는 얼마든지 음수가 될 수 있다.

 

그렇다면, 3×3 행렬의 행렬식은 어떻게 정의될까?

3x3 행렬 B

 

위처럼 3×3 행렬 B 가 있다고 해보자.

그림에서 볼 수 있듯 1행의 원소들 a, b, c 위에는 각각 +, -, + 가 번갈아서 그려져 있다.

우선, B의 행렬식 공식을 보자.

B의 행렬식

 

이 공식에서 a, b, c의 부호가 +, -, + 인 것을 알 수 있다.

그렇다면, a, b, c 각각에 곱해진 2×2 행렬은 어떻게 나온 것일까?

b 의 입장에서 생각해보면, 행과 열이 b 와 아예 겹치지 않는 4개의 원소가 나온다.

(위 그림에서는 색칠되지 않은 원소들)

이 원소들은 2×2 행렬을 자연스럽게 이루게 되고, 이는 행렬식 공식에서 b 옆에 있는 행렬과 같음을 알 수 있다.

 

이제 3차원 행렬식을 알게 되었으니 맨 처음 A, B, C 그림으로 돌아가서 CCW 를 알아보자.

CCW 를 구하는 3x3 행렬

 

우선 이 행렬에서 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 의 계수가 양수인지, 음수인지만 따져주면 된다.

 

최종으로 정리하면,

CCW 를 판단하는 식

 

위 식의 값에 따라 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

댓글