문제
위와 같이 2차원 평면에 벡터 $\overrightarrow{AB}$가 있다. 점 C는 왼쪽방향 혹은 반시계방향(CCW)이고 점 D는 오른쪽방향 혹은 시계방향(CW)라고 할 수 있다.
이때 점C와 점D가 CW인지 CCW인지를 어떻게 판별할 수 있을까?
벡터의 외적으로 알아내기
두 3차원 벡터 $\overrightarrow{a}$와 $\overrightarrow{b}$가 있다. 이때 두 벡터의 외적은 다음과 같이 정의할 수 있다.
$\overrightarrow{a}\times\overrightarrow{b} = \hat{n}\vert\overrightarrow{a}\vert \vert\overrightarrow{b}\vert\sin\theta$
$\theta$는 두 벡터의 각도이며 $\hat{n}$은 두 벡터에 공통으로 수직인 단위 벡터이다. 이때 수직방향은 두 개가 있는데 오른손 법칙을 따르는 방향으로 한다.
성분으로 표현하기
$\overrightarrow{a}=(a_x,a_y,a_z), \overrightarrow{b} = (b_x,b_y,b_z)$일 때 두 벡터의 외적은 다음과 같다.
$\overrightarrow{a}\times\overrightarrow{b} = (a_yb_z - a_zb_y, a_xb_z - b_xa_z, a_xb_y - b_xa_y)$
만약 벡터 $\overrightarrow{a},\overrightarrow{b}$가 2차원 평면위에 있다면, $a_z = b_z = 0$ 일 것이다.
그러므로 $\overrightarrow{a}\times\overrightarrow{b} = (0, 0, a_xb_y - b_xa_y)$ 이 된다.
이제 $a_xb_y - b_xa_y$ 의 부호로 두 벡터가 시계방향인지 반시계방향인지를 알 수 있는데, 위의 오른손 법칙의 그림을 보면 $\overrightarrow{a}\times\overrightarrow{b}$의 z성분이 양수일 때$\overrightarrow{b}$가 $\overrightarrow{a}$의 반시계 방향에 있음을 알 수 있다.
따라서
두 이차원 벡터 $\overrightarrow{a} = (a_x, a_y), \overrightarrow{b} = (b_x, b_y)$가 있을 때, $\overrightarrow{b}$는 $(a_xb_y - a_yb_x)$ 가 0보다 크면 $\overrightarrow{a}$의 반시계 방향에, 0보다 작으면 $\overrightarrow{a}$의 시계 방향에, 0이면 $\overrightarrow{a}$와 같은 선상에 위치함을 알 수 있다.
선분 교차 판별
위 방법으로 두 선분이 교차하는지를 판단할 수 있다.
선분 AB에 대해서 점 D와 C가 각각 다른 방향에 있고, 선분 CD에 대해서 점 A와 B가 각각 다른 방향에 있다면 두 선분은 교차한다.
단, 만약 두 선분이 같은 선상에 존재한다면(즉, 외적의 값이 0이라면) 따로 겹치는지 여부를 구해줘야 한다.
'알고리즘 > 일반' 카테고리의 다른 글
(간단) 분할 상환(amortized) 분석 (+확률적 분석) (0) | 2024.01.28 |
---|---|
알아둘 만한 알고리즘들 (2) | 2022.12.24 |