# 좌표 변환: 이동, 회전, 확대/축소

#### 이동 변환

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}
$$

$$
x' = x + t\_x
$$

$$
y' = y + t\_y
$$

#### 회전 변환

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}
$$

$$
x' = x \cdot s\_x
$$

$$
y' = y \cdot s\_y
$$

#### 결합 변환

이동, 회전, 확대/축소 변환을 결합하여 하나의 복합 변환을 수행할 수 있다. 이러한 결합 변환은 개별 변환 행렬의 곱으로 표현되며, 순서에 따라 결과가 달라진다.

**예시: 이동, 회전, 확대/축소의 결합**

예를 들어, 점을 먼저 이동시키고, 이어서 회전시키고, 마지막으로 확대/축소하고자 하는 경우, 결합 변환 행렬 $\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
$$

**결합 변환의 순서**

순서가 중요한 이유는 다음의 간단한 예시를 통해 확인할 수 있다. 먼저 회전하고 나서 이동하는 경우와, 먼저 이동하고 나서 회전하는 경우 각각을 비교해보자:

1. **먼저 이동, 후에 회전**:

$$
\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
$$

2. **먼저 회전, 후에 이동**:

$$
\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)
$$

이처럼 동일한 변환을 수행하더라도 변환 행렬의 순서에 따라 최종 결과가 달라지게 되므로, 변환 순서를 철저히 고려하여야 한다.
