← 블로그 / 수학

벡터의 외적

벡터의 외적은 두 벡터가 이루는 각도를 알아낼 때 매우 유용하다. 특히, 두 벡터가 서로 평행일 때 외적값이 0이 된다는 사실은 잘 알려져 있다.

벡터의 외적은 두 벡터가 이루는 각도를 알아낼 때 매우 유용하다. 특히, 두 벡터가 서로 평행일 때 외적값이 0이 된다는 사실은 잘 알려져 있다.

기초를 튼튼히

평면에서의 외적값은 기본적으로 3차원으로 생각한다. 왜냐면, 물리학에서 배웠던 무슨무슨 왼손법칙처럼 기본적으로 외적값이라는 것은 방향 개념이 따라오는데, 이 방향이 2차원 축을 뚫고 나가기 때문이다. i, j, k가 각각 3차원의 기본 방향 성분이라고 할 때, 다음이 성립한다.

i⃗×j⃗=k⃗\vec{i} \times \vec{j} = \vec{k}
j⃗×k⃗=i⃗\vec{j} \times \vec{k} = \vec{i}
k⃗×i⃗=j⃗\vec{k} \times \vec{i} = \vec{j}

또한, 방향 개념이 있기 때문에, 만약 순서를 반대로 곱한다면 음수가 붙는 것처럼 된다. (방향이 반대라는 뜻)

j⃗×i⃗=−k⃗\vec{j} \times \vec{i} = -\vec{k}
k⃗×j⃗=−i⃗\vec{k} \times \vec{j} = -\vec{i}
i⃗×k⃗=−j⃗\vec{i} \times \vec{k} = -\vec{j}

외적의 계산

위 식은 이제 unit vector에 대한 이야기이고, 실제로 임의의 두 벡터의 값은 어떻게 구할까? 일단 평면상에 두 점이 있다고 하면, k 방향값은 0으로 고정시킬 수 있을 것이다. 이 경우 다음 두 벡터를 생각하자.

A⃗=(x1y10)(i⃗j⃗k⃗)\vec{A} = \begin{pmatrix}x1 & y1 & 0\end{pmatrix} \begin{pmatrix}\vec{i}\\\vec{j}\\\vec{k}\end{pmatrix}
B⃗=(x2y20)(i⃗j⃗k⃗)\vec{B} = \begin{pmatrix}x2 & y2 & 0\end{pmatrix} \begin{pmatrix}\vec{i}\\\vec{j}\\\vec{k}\end{pmatrix}

이 때의 외적값은 아래처럼 된다.

A⃗×B⃗=(00x1y2−x2y1)(i⃗j⃗k⃗)\vec{A} \times \vec{B} = \begin{pmatrix}0 & 0 & x1y2 - x2y1\end{pmatrix} \begin{pmatrix}\vec{i}\\\vec{j}\\\vec{k}\end{pmatrix}
  1. 방향은 평면에서 오른손으로 a -> b 방향으로 감싸쥔 방향으로 적용된다. (z축이냐, -z축이냐의 차이만 있다)
  2. 벡터의 크기는 x1y2 - x2y1이다.

그렇다면 일반적인 임의의 두 벡터의 외적은 어떻게 계산될까? 두 벡터를 (x1, y1, z1), (x2, y2, z2)로 정의하면, 각 방향 성분은 아래와 같다.

A⃗×B⃗=∣y1z1y2z2∣i⃗+∣x1z1x2z2∣j⃗+∣x1y1x2y2∣k⃗=(y1z2−y2z1z1x2−z2x1x1y2−x2y1)(i⃗j⃗k⃗)\vec{A} \times \vec{B} = \begin{vmatrix} y1 & z1 \\ y2 & z2 \end{vmatrix} \vec{i} + \begin{vmatrix} x1 & z1 \\ x2 & z2 \end{vmatrix} \vec{j} + \begin{vmatrix} x1 & y1 \\ x2 & y2 \end{vmatrix} \vec{k} \newline = \begin{pmatrix} y1 z2 - y2 z1 & z1 x2 - z2 x1 & x1 y2 - x2 y1 \end{pmatrix} \begin{pmatrix} \vec{i} \\ \vec{j} \\ \vec{k} \end{pmatrix}

외우기 쉽게 생각하면 x를 구할 때에는 x가 없는 형태이다. 이를 3*3 행렬식으로는 아래처럼도 나타낸다.

A⃗×B⃗=∣i⃗j⃗k⃗x1y1z1x2y2z2∣\vec{A} \times \vec{B} = \begin{vmatrix} \vec{i} & \vec{j} & \vec{k} \\ x1 & y1 & z1 \\ x2 & y2 & z2 \end{vmatrix}

외적의 크기

이는 쉽게 증명될 수 있지만 결과만 기억하자.

∣A⃗×B⃗∣=∣A⃗∣∣B⃗∣sinθ|\vec{A} \times \vec{B}| = |\vec{A}||\vec{B}|sin\theta

sin 값은 180도, 360도에서 0이 되고, 이는 벡터가 왜 평행일 때 외적값이 0이 되는지를 알려준다.

오목과 볼록

오목과 볼록은 정하기 나름이지만, 아무튼 위 sinθsin\theta의 성질을 생각하면, 180도 기준으로 그 부호가 바뀌는 것은 명백하다. 오목, 볼록의 기준을 나누는 값이 180도가 되므로, 음수, 양수에 따라 오목, 볼록을 판정하면 된다. Convex Hull 과 같은 알고리즘에서 사용되는 성질이다. 사실 이거 때문에 간만에 외적을 다시 봤다. 주로 알고리즘에서 CCW라고 부르는 판별방식을 알아보자.

CCW

CCW는 Counter-Clockwise, 즉 반시계 방향으로 두 벡터가 정렬되었는지를 알게 해주는 값이다. 이를 구하기 위해서 세 점 A, B, C가 있다고 하자. (사이점이 B이다) 이때, 두 벡터 BA→\overrightarrow{BA}와 BC→\overrightarrow{BC}를 정의할 수 있다. 각각의 벡터값을 (x1, y1), (x2, y2) 라 하면,

BA→×BC→=(00x1y2−x2y1)(i⃗j⃗k⃗)\overrightarrow{BA} \times \overrightarrow{BC} = \begin{pmatrix}0 & 0 & x1y2 - x2y1\end{pmatrix} \begin{pmatrix}\vec{i}\\\vec{j}\\\vec{k}\end{pmatrix}

이 된다. 따라서 k 방향의 값만 존재하고, 이 값은 또한 아래와 같다.

∣BA→×BC→∣=∣BA→∣∣BC→∣sinθ=x1y2−x2y1|\overrightarrow{BA} \times \overrightarrow{BC}| = |\overrightarrow{BA}||\overrightarrow{BC}|sin\theta = x1y2 - x2y1

즉, x1y2 - x2y1 값이 양수이면 두 벡터가 예각을 이루고, 음수이면 둔각을 이룬다. CCW는 음수일 때로 판정하면 되겠다.