알고리즘/일반

2차원에서 방향 판단하기 (CCW)

tsyang 2021. 9. 12. 23:50

문제

 

 

위와 같이 2차원 평면에 벡터 AB가 있다. 점 C는 왼쪽방향 혹은 반시계방향(CCW)이고 점 D는 오른쪽방향 혹은 시계방향(CW)라고 할 수 있다. 

 

이때 점C와 점D가 CW인지 CCW인지를 어떻게 판별할 수 있을까?

 

 

벡터의 외적으로 알아내기

 

두 3차원 벡터 ab가 있다. 이때 두 벡터의 외적은 다음과 같이 정의할 수 있다.

 

 

a×b=n^|a||b|sinθ

 

θ는 두 벡터의 각도이며 n^은 두 벡터에 공통으로 수직인 단위 벡터이다. 이때 수직방향은 두 개가 있는데 오른손 법칙을 따르는 방향으로 한다.

 

출처 : https://en.wikipedia.org/wiki/Right-hand_rule

 

 

성분으로 표현하기

 

a=(ax,ay,az),b=(bx,by,bz)일 때 두 벡터의 외적은 다음과 같다.

 

a×b=(aybzazby,axbzbxaz,axbybxay)

 

만약 벡터 a,b가 2차원 평면위에 있다면, az=bz=0 일 것이다.

 

그러므로 a×b=(0,0,axbybxay) 이 된다.

 

이제 axbybxay 의 부호로 두 벡터가 시계방향인지 반시계방향인지를 알 수 있는데, 위의 오른손 법칙의 그림을 보면 a×b의 z성분이 양수일 때ba의 반시계 방향에 있음을 알 수 있다.

 

따라서

 

두 이차원 벡터 a=(ax,ay),b=(bx,by)가 있을 때, b는  (axbyaybx) 가 0보다 크면 a의 반시계 방향에, 0보다 작으면 a의 시계 방향에, 0이면 a와 같은 선상에 위치함을 알 수 있다.

 

 

선분 교차 판별

 

위 방법으로 두 선분이 교차하는지를 판단할 수 있다.

 

선분 AB에 대해서 점 D와 C가 각각 다른 방향에 있고, 선분 CD에 대해서 점 A와 B가 각각 다른 방향에 있다면 두 선분은 교차한다.

 

단, 만약 두 선분이 같은 선상에 존재한다면(즉, 외적의 값이 0이라면) 따로 겹치는지 여부를 구해줘야 한다.