# 2D 및 3D 스케일링 변환

스케일링 변환의 목적은 객체의 크기를 변경하는 데 있다. 이 변환은 객체의 중심을 기준으로 객체의 크기를 일괄적으로 조정한다. 스케일링 변환은 2D와 3D 모두에서 유사한 방식으로 처리된다.

**2D 스케일링 변환**

2D 공간에서 객체를 스케일링하기 위해서는 객체의 각 점의 $(x, y)$ 좌표를 새로운 좌표 $(x', y')$로 변환해야 한다. 이 변환은 다음과 같은 행렬을 이용하여 수행될 수 있다:

$$
\mathbf{S}\_{2D} = \begin{bmatrix} s\_x & 0 \ 0 & s\_y \end{bmatrix}
$$

여기서 $s\_x$와 $s\_y$는 각각 $x$ 축과 $y$ 축 방향의 스케일링 인자이다. 이 스케일링 행렬을 이용하여 입력 점 $\mathbf{p} = \begin{bmatrix} x \ y \end{bmatrix}$를 변환된 점 $\mathbf{p}' = \begin{bmatrix} x' \ y' \end{bmatrix}$로 변환할 수 있다:

$$
\mathbf{p}' = \mathbf{S}\_{2D} \mathbf{p} = \begin{bmatrix} s\_x & 0 \ 0 & s\_y \end{bmatrix} \begin{bmatrix} x \ y \end{bmatrix} = \begin{bmatrix} s\_x x \ s\_y y \end{bmatrix}
$$

따라서, 스케일링 변환 후의 새로운 좌표는 다음과 같이 계산된다:

$$
x' = s\_x x, \quad y' = s\_y y
$$

**3D 스케일링 변환**

3D 공간에서는 스케일링 변환이 각 축에 대해 독립적으로 일어난다. 3D 스케일링 변환 행렬은 다음과 같다:

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

여기서 $s\_x$, $s\_y$, $s\_z$는 각각 $x$, $y$, $z$ 축 방향의 스케일링 인자이다. 입력 점 $\mathbf{p} = \begin{bmatrix} x \ y \ z \end{bmatrix}$를 변환된 점 $\mathbf{p}' = \begin{bmatrix} x' \ y' \ z' \end{bmatrix}$로 변환하기 위한 수식은 다음과 같다:

$$
\mathbf{p}' = \mathbf{S}\_{3D} \mathbf{p} = \begin{bmatrix} s\_x & 0 & 0 \ 0 & s\_y & 0 \ 0 & 0 & s\_z \end{bmatrix} \begin{bmatrix} x \ y \ z \end{bmatrix} = \begin{bmatrix} s\_x x \ s\_y y \ s\_z z \end{bmatrix}
$$

따라서, 변환 후의 새로운 좌표는 다음과 같이 계산된다:

$$
x' = s\_x x, \quad y' = s\_y y, \quad z' = s\_z z
$$

#### 동차 좌표계를 사용한 스케일링 변환

동차 좌표계를 사용하면 스케일링 변환을 더욱 효율적으로 처리할 수 있다.

**2D 동차 좌표계를 사용한 스케일링 변환**

2D 동차 좌표계에서 변환 행렬은 다음과 같다:

$$
\mathbf{S}\_{2D}^{h} = \begin{bmatrix} s\_x & 0 & 0 \ 0 & s\_y & 0 \ 0 & 0 & 1 \end{bmatrix}
$$

동차 좌표로 표현된 입력 점 $\mathbf{p}^{h} = \begin{bmatrix} x \ y \ 1 \end{bmatrix}$를 변환된 점 $\mathbf{p'}^{h} = \begin{bmatrix} x' \ y' \ 1 \end{bmatrix}$로 변환하기 위한 수식은 다음과 같다:

$$
\mathbf{p'}^{h} = \mathbf{S}\_{2D}^{h} \mathbf{p}^{h} = \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 x \ s\_y y \ 1 \end{bmatrix}
$$

**3D 동차 좌표계를 사용한 스케일링 변환**

3D 동차 좌표계에서 변환 행렬은 다음과 같다:

$$
\mathbf{S}\_{3D}^{h} = \begin{bmatrix} s\_x & 0 & 0 & 0 \ 0 & s\_y & 0 & 0 \ 0 & 0 & s\_z & 0 \ 0 & 0 & 0 & 1 \end{bmatrix}
$$

표현된 입력 점 $\mathbf{p}^{h} = \begin{bmatrix} x \ y \ z \ 1 \end{bmatrix}$를 변환된 점 $\mathbf{p'}^{h} = \begin{bmatrix} x' \ y' \ z' \ 1 \end{bmatrix}$로 변환하기 위한 수식은 다음과 같다:

$$
\mathbf{p'}^{h} = \mathbf{S}\_{3D}^{h} \mathbf{p}^{h} = \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}
$$

이와 같이 동차 좌표계를 사용하면 스케일링 변환을 간단히 행렬곱을 통해 수행할 수 있다.

#### 스케일링의 특징 및 주의점

스케일링 변환을 적용할 때 몇 가지 중요한 특징과 주의점을 살펴보아야 한다:

1. **비례 스케일링(setproportionate scaling)**: $s\_x$, $s\_y$, $s\_z$의 값이 같으면 모든 축에 대해 비례적으로 크기가 변한다.
2. **비비례 스케일링(non-uniform scaling)**: 각 축에 대해 다른 값을 사용하면 비비례적으로 크기가 변한다.
3. **부호**: 스케일링 인자가 음수일 경우 해당 축 방향으로 대칭 변환이 발생한다.
4. **중심 축 문제**: 스케일링 중심이 변환되지 않는 한, 객체의 중심이 원점에 위치하지 않으면 비례의 왜곡이 일어날 수 있다. 이를 해결하기 위해서는 이후에 변환된 객체를 다시 적절한 위치로 이동시키는 추가적인 변환이 필요할 수 있다.
