이동 변환
2차원 좌표에서 물체를 이동시키기 위해서는 각 점 \mathbf{P} = (x, y)에 대해 동일한 벡터 \mathbf{t} = (t_x, t_y)만큼 더하면 된다. 이를 행렬로 표현하면 다음과 같다:
\mathbf{P}' = \mathbf{P} + \mathbf{t}
동차좌표계를 사용하면 이 이동 변환을 행렬 곱셈으로 표현할 수 있다. 동차좌표계에서 점 \mathbf{P} = (x, y)는 \mathbf{P}_h = (x, y, 1)로 나타내어진다. 이때 이동 변환 행렬 \mathbf{T}는 다음과 같다:
\mathbf{T} =
\begin{bmatrix}
1 & 0 & t_x \\
0 & 1 & t_y \\
0 & 0 & 1
\end{bmatrix}
따라서, 이동 변환은 다음과 같이 표현된다:
\mathbf{P}'_h = \mathbf{T} \mathbf{P}_h
이를 전개하면 다음과 같다:
\begin{bmatrix}
x' \\
y' \\
1
\end{bmatrix}
=
\begin{bmatrix}
1 & 0 & t_x \\
0 & 1 & t_y \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
x \\
y \\
1
\end{bmatrix}
회전 변환
2차원 좌표에서 점을 원점 기준으로 \theta 각도만큼 회전시키기 위해서는 다음과 같은 회전 변환 행렬을 사용한다:
\mathbf{R}(\theta) =
\begin{bmatrix}
\cos \theta & -\sin \theta & 0 \\
\sin \theta & \cos \theta & 0 \\
0 & 0 & 1
\end{bmatrix}
회전 변환 후의 점 \mathbf{P}'_h는 다음과 같이 계산된다:
\mathbf{P}'_h = \mathbf{R}(\theta) \mathbf{P}_h
이를 전개하면 다음과 같다:
\begin{bmatrix}
x' \\
y' \\
1
\end{bmatrix}
=
\begin{bmatrix}
\cos \theta & -\sin \theta & 0 \\
\sin \theta & \cos \theta & 0 \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
x \\
y \\
1
\end{bmatrix}
x' = x \cos \theta - y \sin \theta
y' = x \sin \theta + y \cos \theta
확대/축소 변환
확대/축소 변환은 각 축에 대해 독립적으로 스케일링 팩터를 적용하여 수행된다. 스케일링 팩터를 s_x와 s_y라고 하면, 2차원 동차좌표계에서 확대/축소 변환 행렬 \mathbf{S}는 다음과 같다:
\mathbf{S} =
\begin{bmatrix}
s_x & 0 & 0 \\
0 & s_y & 0 \\
0 & 0 & 1
\end{bmatrix}
따라서, 확대/축소 변환 후의 점 \mathbf{P}'_h는 다음과 같이 계산된다:
\mathbf{P}'_h = \mathbf{S} \mathbf{P}_h
이를 전개하면 다음과 같다:
\begin{bmatrix}
x' \\
y' \\
1
\end{bmatrix}
=
\begin{bmatrix}
s_x & 0 & 0 \\
0 & s_y & 0 \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
x \\
y \\
1
\end{bmatrix}
결합 변환
이동, 회전, 확대/축소 변환을 결합하여 하나의 복합 변환을 수행할 수 있다. 이러한 결합 변환은 개별 변환 행렬의 곱으로 표현되며, 순서에 따라 결과가 달라진다.
예시: 이동, 회전, 확대/축소의 결합
예를 들어, 점을 먼저 이동시키고, 이어서 회전시키고, 마지막으로 확대/축소하고자 하는 경우, 결합 변환 행렬 \mathbf{T}, \mathbf{R}(\theta), \mathbf{S}를 다음과 같이 적용한다:
\mathbf{C} = \mathbf{S} \mathbf{R}(\theta) \mathbf{T}
이를 통해 초기 동차좌표 점 \mathbf{P}_h = (x, y, 1)는 다음과 같이 변환된다:
\mathbf{P}'_h = \mathbf{C} \mathbf{P}_h
결합 변환의 순서
순서가 중요한 이유는 다음의 간단한 예시를 통해 확인할 수 있다. 먼저 회전하고 나서 이동하는 경우와, 먼저 이동하고 나서 회전하는 경우 각각을 비교해보자:
- 먼저 이동, 후에 회전:
\mathbf{T}_1 =
\begin{bmatrix}
1 & 0 & t_x \\
0 & 1 & t_y \\
0 & 0 & 1
\end{bmatrix}
\mathbf{R}(\theta) =
\begin{bmatrix}
\cos \theta & -\sin \theta & 0 \\
\sin \theta & \cos \theta & 0 \\
0 & 0 & 1
\end{bmatrix}
그리고 결합 변환 행렬은:
\mathbf{C}_1 = \mathbf{R}(\theta) \mathbf{T}_1
- 먼저 회전, 후에 이동:
\mathbf{T}_2 =
\begin{bmatrix}
1 & 0 & t_x' \\
0 & 1 & t_y' \\
0 & 0 & 1
\end{bmatrix}
\mathbf{R}(\theta) =
\begin{bmatrix}
\cos \theta & -\sin \theta & 0 \\
\sin \theta & \cos \theta & 0 \\
0 & 0 & 1
\end{bmatrix}
그리고 결합 변환 행렬은:
\mathbf{C}_2 = \mathbf{T}_2 \mathbf{R}(\theta)
이처럼 동일한 변환을 수행하더라도 변환 행렬의 순서에 따라 최종 결과가 달라지게 되므로, 변환 순서를 철저히 고려하여야 한다.