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

### 이동 변환

이동 변환은 원점을 기준으로 벡터 $\mathbf{t} = (t\_x, t\_y, t\_z)$만큼 좌표를 평행 이동시키는 것을 말한다. 이는 동차좌표계를 사용하면 다음과 같이 표현할 수 있다.

이동 변환을 $\mathbf{T}$ 행렬로 나타내면:

$$
\mathbf{T}=\begin{bmatrix} 1 & 0 & 0 & t\_x \ 0 & 1 & 0 & t\_y \ 0 & 0 & 1 & t\_z \ 0 & 0 & 0 & 1 \end{bmatrix}
$$

3차원 점 $\mathbf{p} = (x, y, z, 1)$을 이동시키려면, $\mathbf{p}'$를 구하는 식은 다음과 같다.

$$
\mathbf{p}' = \mathbf{T} \mathbf{p}
$$

이를 풀어서 쓰면:

$$
\begin{bmatrix} x' \ y' \ z' \ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & t\_x \ 0 & 1 & 0 & t\_y \ 0 & 0 & 1 & t\_z \ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \ y \ z \ 1 \end{bmatrix} = \begin{bmatrix} x + t\_x \ y + t\_y \ z + t\_z \ 1 \end{bmatrix}
$$

따라서, 이동된 좌표는 $\mathbf{p}' = (x + t\_x, y + t\_y, z + t\_z)$가 된다.

### 회전 변환

회전 변환은 특정 축을 중심으로 주어진 각도만큼 회전시키는 것을 말한다. 회전 변환은 축에 따라 다른 변환 행렬을 갖는다.

#### x축 회전

$\theta$만큼 x축을 기준으로 회전하는 변환은 다음과 같다:

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

#### y축 회전

$\theta$만큼 y축을 기준으로 회전하는 변환은 다음과 같다:

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

#### z축 회전

$\theta$만큼 z축을 기준으로 회전하는 변환은 다음과 같다:

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

회전 변환을 적용하기 위해서는 해당 회전 행렬을 원래의 동차 좌표에 곱해주면 된다. 예를 들어, 점 $\mathbf{p}$를 x축 기준 $\theta$만큼 회전시키려면:

$$
\mathbf{p}' = \mathbf{R}\_x(\theta) \mathbf{p}
$$

### 확대/축소 변환

확대/축소 변환은 각 축을 기준으로 크기를 조절하는 변환을 말한다. 확대/축소 변환 행렬은 다음과 같다:

$$
\mathbf{S} = \begin{bmatrix} s\_x & 0 & 0 & 0 \ 0 & s\_y & 0 & 0 \ 0 & 0 & s\_z & 0 \ 0 & 0 & 0 & 1 \end{bmatrix}
$$

여기서 $s\_x$, $s\_y$, $s\_z$는 각각 x, y, z축 방향의 확대/축소 비율이다.

축소/확대를 적용하려면 단순히 $\mathbf{S}$를 원래의 점에 곱해주면 된다:

$$
\mathbf{p}' = \mathbf{S} \mathbf{p}
$$

이를 풀어서 쓰면:

$$
\begin{bmatrix} x' \ y' \ z' \ 1 \end{bmatrix} = \begin{bmatrix} s\_x & 0 & 0 & 0 \ 0 & s\_y & 0 & 0 \ 0 & 0 & s\_z & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \ y \ z \ 1 \end{bmatrix} = \begin{bmatrix} s\_x x \ s\_y y \ s\_z z \ 1 \end{bmatrix}
$$

따라서, 확대/축소된 좌표는 $\mathbf{p}' = (s\_x x, s\_y y, s\_z z)$가 된다.

### 복합 변환

복합 변환은 여러 개의 기본 변환(이동, 회전, 확대/축소)을 결합하여 하나의 변환으로 만들어낸 것이다. 이를 위해 각 변환 행렬을 곱하면 된다. 각 변환의 순서가 중요하다. 일반적으로, 변환의 순서는 다음과 같이 적용된다:

1. 확대/축소 변환
2. 회전 변환
3. 이동 변환

예를 들어, 점 $\mathbf{p}$에 대해 먼저 확대/축소 $\mathbf{S}$, 그 다음 회전 $\mathbf{R}$, 마지막으로 이동 $\mathbf{T}$를 적용하려면 복합 변환 행렬은 다음과 같다:

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

따라서, 점 $\mathbf{p}$의 최종 변환된 위치 $\mathbf{p}'$는:

$$
\mathbf{p}' = \mathbf{M} \mathbf{p} = \mathbf{T} \mathbf{R} \mathbf{S} \mathbf{p}
$$

다음은 각 기본 변환들을 복합하여 변환 행렬을 계산하는 예시이다. 예를 들어, 먼저 x축으로 2배 확대, z축으로 45도 회전, 마지막으로 (5, 5, 0)만큼 이동시키는 변환을 복합하면:

1. 확대/축소 변환 행렬 $\mathbf{S}$:

$$
\mathbf{S} = \begin{bmatrix} 2 & 0 & 0 & 0 \ 0 & 1 & 0 & 0 \ 0 & 0 & 1 & 0 \ 0 & 0 & 0 & 1 \end{bmatrix}
$$

2. z축 회전 변환 행렬 $\mathbf{R}\_z (45^\circ)$:

$$
\mathbf{R}\_z = \begin{bmatrix} \cos{45^\circ} & -\sin{45^\circ} & 0 & 0 \ \sin{45^\circ} & \cos{45^\circ} & 0 & 0 \ 0 & 0 & 1 & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} & 0 & 0 \ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & 0 & 0 \ 0 & 0 & 1 & 0 \ 0 & 0 & 0 & 1 \end{bmatrix}
$$

3. 이동 변환 행렬 $\mathbf{T}$:

$$
\mathbf{T} = \begin{bmatrix} 1 & 0 & 0 & 5 \ 0 & 1 & 0 & 5 \ 0 & 0 & 1 & 0 \ 0 & 0 & 0 & 1 \end{bmatrix}
$$

각 변환 행렬을 각각 순서대로 곱하면 복합 변환 행렬 $\mathbf{M}$은 다음과 같다:

$$
\mathbf{M} = \mathbf{T} \mathbf{R}\_z \mathbf{S}
$$

$$
\= \begin{bmatrix} 1 & 0 & 0 & 5 \ 0 & 1 & 0 & 5 \ 0 & 0 & 1 & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} & 0 & 0 \ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & 0 & 0 \ 0 & 0 & 1 & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 2 & 0 & 0 & 0 \ 0 & 1 & 0 & 0 \ 0 & 0 & 1 & 0 \ 0 & 0 & 0 & 1 \end{bmatrix}
$$

이를 계산하면 최종 복합 변환 행렬 $\mathbf{M}$을 얻을 수 있다.

이제 해당 복합 변환 행렬을 원래의 점 $\mathbf{p}$에 적용하면 최종 변환된 좌표를 구할 수 있다.
