# 행렬을 이용한 좌표 변환

동차좌표계에서 행렬을 이용한 좌표 변환에 대해 자세히 설명하겠다.

#### 기본 개념

동차 좌표계 (Homogeneous Coordinates)에서는 일반적인 유클리드 공간의 좌표에 추가적인 차원을 더하여 행렬을 통해 쉽게 변환할 수 있다. 2차원 공간의 경우, 이를 3차원 벡터로 확장하여 표현하고, 3차원 공간의 경우 4차원 벡터로 확장한다.

#### 2차원 변환

2차원 공간에서 동차 좌표계를 사용하기 위해서 점 $(x, y)$를 동차 좌표 $(x, y, 1)$로 확장한다.

**이동 변환 (Translation)**

2차원에서 점을 $(t\_x, t\_y)$만큼 이동시키는 변환은 다음과 같은 3x3 행렬로 표현된다.

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

변환된 점 $(x', y', 1)$는 다음과 같이 계산된다.

$$
\begin{bmatrix} x' \ y' \ 1 \end{bmatrix} = \mathbf{T} \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} = \begin{bmatrix} x + t\_x \ y + t\_y \ 1 \end{bmatrix}
$$

#### 3차원 변환

3차원 공간에서 $(x, y, z)$는 동차 좌표 $(x, y, z, 1)$로 확장된다.

**이동 변환 (Translation)**

3차원에서 점을 $(t\_x, t\_y, t\_z)$만큼 이동시키는 변환은 다음과 같은 4x4 행렬로 표현된다.

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

변환된 점 $(x', y', z', 1)$은 다음과 같이 계산된다.

$$
\begin{bmatrix} x' \ y' \ z' \ 1 \end{bmatrix} = \mathbf{T} \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}
$$

#### 회전 변환 (Rotation)

회전 변환은 특정 축을 중심으로 점을 회전시키는 변환이다.

**2차원 회전 변환**

2차원에서 원점 기준 $\theta$ 라디안 만큼 회전하는 변환은 다음과 같은 형태를 갖는다.

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

회전된 점은 아래와 같이 계산된다.

$$
\begin{bmatrix} x' \ y' \ 1 \end{bmatrix} = \mathbf{R} \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} = \begin{bmatrix} x\cos \theta - y\sin \theta \ x\sin \theta + y\cos \theta \ 1 \end{bmatrix}
$$

**3차원 회전 변환**

3차원에서 회전 변환은 각 축을 중심으로 하는 회전으로 구분된다. 회전 행렬은 각각의 회전축에 대해 다음과 같이 정의된다.

1. **X축 회전 (Roll)**

X축을 기준으로 $\theta$ 라디안 만큼 회전하는 행렬:

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

2. **Y축 회전 (Pitch)**

Y축을 기준으로 $\theta$ 라디안 만큼 회전하는 행렬:

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

3. **Z축 회전 (Yaw)**

Z축을 기준으로 $\theta$ 라디안 만큼 회전하는 행렬:

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

회전된 점 $(x', y', z', 1)$는 각각의 회전 행렬을 사용하여 계산된다.

#### 확대 변환 (Scaling)

확대 변환은 점의 좌표를 일정 비율로 확장하거나 축소하는 변환이다. 다음은 2차원과 3차원에서 각각의 확대 변환 행렬이다.

**2차원 확대 변환**

$(s\_x, s\_y)$만큼 확대하는 변환 행렬:

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

**3차원 확대 변환**

$(s\_x, s\_y, s\_z)$만큼 확대하는 변환 행렬:

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

#### 동차좌표계에서의 변환 조합

동차 좌표계를 사용하는 큰 장점 중 하나는 여러 변환을 연속적으로 적용할 수 있다는 것이다. 여러 변환을 조합하면 각 변환 행렬을 곱하여 하나의 행렬로 통합할 수 있다.

예를 들어, 2차원에서 먼저 회전(θ), 이후에 이동(tx, ty)을 수행하는 경우 전체 변환 행렬은 다음과 같다.

$$
\mathbf{M} = \mathbf{T} \cdot \mathbf{R} = \begin{bmatrix} 1 & 0 & t\_x \ 0 & 1 & t\_y \ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \cos \theta & -\sin \theta & 0 \ \sin \theta & \cos \theta & 0 \ 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} \cos \theta & -\sin \theta & t\_x \ \sin \theta & \cos \theta & t\_y \ 0 & 0 & 1 \end{bmatrix}
$$

이 변환 행렬을 점 $(x, y, 1)$에 적용하여 최종적인 좌표를 얻을 수 있다.

***

동차좌표계와 행렬을 활용하면 다양한 2차원 및 3차원 변환을 간단하고 효율적으로 수행할 수 있다. 변환을 조합하거나 복합적인 공간 변환을 수행할 때 특히 유용하며, 이를 통해 그래픽스, 로보틱스 등 다양한 분야에서 변환 작업을 체계적으로 수행할 수 있다.
