본문 바로가기
알고리즘

벡터 외적으로 CCW (Counter ClockWise) 이해하기

by 초특급하품 2019. 10. 17.

기하에서 좌표를 다룰 때 각 점 또는 선분의 상대적인 위치를 구하는 것은 아주 중요하다.

이 작은 연산을 토대로 여러 가지 작업을 할 수 있기 때문인데, 먼저 선분과 점의 상대적인 위치를 구하는 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

댓글