2차원 동차좌표계(homogeneous coordinate system)는 컴퓨터 그래픽스와 다른 응용 분야에서 변환을 보다 쉽게 처리하는 중요한 도구 중 하나이다. 평면 내의 한 점을 동차좌표로 표현하면 보다 복잡한 변환을 간단히 매트릭스 연산으로 해결할 수 있다.

동차좌표계의 정의

우리가 흔히 알고 있는 데카르트 좌표계에서는 2차원 공간의 어떤 점 (x, y)\mathbf{p} = \begin{bmatrix} x \\ y \end{bmatrix}로 나타낸다. 그러나 동차좌표계에서는 이와 같은 점을 3개의 요소로 확장하여 \mathbf{p} = \begin{bmatrix} x \\ y \\ w \end{bmatrix}로 나타낸다. 여기서 몇 가지 중요한 규칙이 따른다:

  1. w \neq 0이어야 한다.
  2. 동차좌표 \mathbf{p} = \begin{bmatrix} x \\ y \\ w \end{bmatrix}는 데카르트 좌표 \begin{bmatrix} x \\ y \end{bmatrix}에 의해 다음과 같이 대응된다:
\begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} \frac{x}{w} \\ \frac{y}{w} \end{bmatrix}

즉, 동차좌표계에서의 점 \mathbf{p}는 스칼라 w를 나눈 좌표값으로 데카르트 좌표계의 한 점을 표현하게 된다.

동차좌표의 변환

이제 동차좌표를 이용하여 2차원 평면의 점을 변환해보겠다. 2차원의 다양한 변환 (예: 평행이동, 스케일링, 회전)들은 동차좌표계에서 행렬 곱셈으로 간단히 표현할 수 있다.

평행이동 (Translation)

(x, y)(x', y')로 평행이동 하는 동차좌표 변환 행렬은 다음과 같다:

\mathbf{T} = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix}

여기서 t_xt_y는 각각 x축과 y축 방향으로의 이동량이다. 어떤 점 \mathbf{p} = \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}에 이 변환을 적용하면 이동된 점 \mathbf{p'}는 다음과 같이 계산된다:

\mathbf{p'} = \mathbf{T} \mathbf{p} = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} x + t_x \\ y + t_y \\ 1 \end{bmatrix}

스케일링 (Scaling)

(x, y)(sx, sy)로 스케일링하는 동차좌표 변환 행렬은 다음과 같다:

\mathbf{S} = \begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{bmatrix}

여기서 s_xs_y는 각각 x축과 y축 방향으로의 스케일링 팩터이다. 어떤 점 \mathbf{p} = \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}에 이 변환을 적용하면 스케일링된 점 \mathbf{p'}는 다음과 같이 계산된다:

\mathbf{p'} = \mathbf{S} \mathbf{p} = \begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} s_x \cdot x \\ s_y \cdot y \\ 1 \end{bmatrix}

회전 (Rotation)

(x, y)를 원점 중심으로 \theta만큼 회전시키는 동차좌표 변환 행렬은 다음과 같다:

\mathbf{R} = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix}

어떤 점 \mathbf{p} = \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}에 이 변환을 적용하면 회전된 점 \mathbf{p'}는 다음과 같이 계산된다:

\mathbf{p'} = \mathbf{R} \mathbf{p} = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} x\cos\theta - y\sin\theta \\ x\sin\theta + y\cos\theta \\ 1 \end{bmatrix}

동차좌표 변환의 합성

동차좌표계의 큰 장점 중 하나는 여러 변환을 간단히 행렬 곱셈으로 합성할 수 있다는 점이다. 예를 들어, 점 (x, y)를 먼저 스케일링하고 그다음 회전시키려면, 각 변환 행렬을 순서대로 곱하여 새로운 변환 행렬을 얻을 수 있다:

\mathbf{M} = \mathbf{R} \mathbf{S}

따라서 변환된 점 \mathbf{p'}는 다음과 같이 계산된다:

\mathbf{p'} = \mathbf{M} \mathbf{p} = (\mathbf{R} \mathbf{S}) \mathbf{p}

이와 같이 동차좌표 변환을 합성하여 사용하면, 여러 개의 복잡한 변환도 한 번의 행렬 연산으로 간단히 처리할 수 있다.

일반적인 예시

아래는 실습을 위한 간단한 예시이다. 주어진 점 \mathbf{p} = (2, 3)\theta = 90^\circ만큼 회전시키고, (4, 2)만큼 평행이동시키는 과정을 살펴보겠다.

회전 변환 행렬:

\mathbf{R} = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix}

평행이동 변환 행렬:

\mathbf{T} = \begin{bmatrix} 1 & 0 & 4 \\ 0 & 1 & 2 \\ 0 & 0 & 1 \end{bmatrix}

\mathbf{p}의 동차좌표:

\mathbf{p} = \begin{bmatrix} 2 \\ 3 \\ 1 \end{bmatrix}

단계별 변환:

  1. 회전:
\mathbf{p'} = \mathbf{R} \mathbf{p} = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 2 \\ 3 \\ 1 \end{bmatrix} = \begin{bmatrix} -3 \\ 2 \\ 1 \end{bmatrix}
  1. 평행이동:
\mathbf{p''} = \mathbf{T} \mathbf{p'} = \begin{bmatrix} 1 & 0 & 4 \\ 0 & 1 & 2 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} -3 \\ 2 \\ 1 \end{bmatrix} = \begin{bmatrix} 1 \\ 4 \\ 1 \end{bmatrix}

따라서 최종 변환된 점은 (1, 4)이다.