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}로 나타낸다. 여기서 몇 가지 중요한 규칙이 따른다:
- w \neq 0이어야 한다.
- 동차좌표 \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_x와 t_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_x와 s_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}
단계별 변환:
- 회전:
\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}
- 평행이동:
\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)이다.