# 2차원 평면에서의 표현

2차원 동차좌표계(homogeneous coordinate system)는 컴퓨터 그래픽스와 다른 응용 분야에서 변환을 보다 쉽게 처리하는 중요한 도구 중 하나이다. 평면 내의 한 점을 동차좌표로 표현하면 보다 복잡한 변환을 간단히 매트릭스 연산으로 해결할 수 있다.

#### 동차좌표계의 정의

우리가 흔히 알고 있는 데카르트 좌표계에서는 2차원 공간의 어떤 점 $(x, y)$를 $\mathbf{p} = \begin{bmatrix} x \ y \end{bmatrix}$로 나타낸다. 그러나 동차좌표계에서는 이와 같은 점을 3개의 요소로 확장하여 $\mathbf{p} = \begin{bmatrix} x \ y \ w \end{bmatrix}$로 나타낸다. 여기서 몇 가지 중요한 규칙이 따른다:

1. $w \neq 0$이어야 한다.
2. 동차좌표 $\mathbf{p} = \begin{bmatrix} x \ y \ w \end{bmatrix}$는 데카르트 좌표 $\begin{bmatrix} x \ y \end{bmatrix}$에 의해 다음과 같이 대응된다:

$$
\begin{bmatrix} x \ y \end{bmatrix} = \begin{bmatrix} \frac{x}{w} \ \frac{y}{w} \end{bmatrix}
$$

즉, 동차좌표계에서의 점 $\mathbf{p}$는 스칼라 $w$를 나눈 좌표값으로 데카르트 좌표계의 한 점을 표현하게 된다.

#### 동차좌표의 변환

이제 동차좌표를 이용하여 2차원 평면의 점을 변환해보겠다. 2차원의 다양한 변환 (예: 평행이동, 스케일링, 회전)들은 동차좌표계에서 행렬 곱셈으로 간단히 표현할 수 있다.

**평행이동 (Translation)**

점 $(x, y)$를 $(x', y')$로 평행이동 하는 동차좌표 변환 행렬은 다음과 같다:

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

여기서 $t\_x$와 $t\_y$는 각각 x축과 y축 방향으로의 이동량이다. 어떤 점 $\mathbf{p} = \begin{bmatrix} x \ y \ 1 \end{bmatrix}$에 이 변환을 적용하면 이동된 점 $\mathbf{p'}$는 다음과 같이 계산된다:

$$
\mathbf{p'} = \mathbf{T} \mathbf{p} = \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}
$$

**스케일링 (Scaling)**

점 $(x, y)$를 $(sx, sy)$로 스케일링하는 동차좌표 변환 행렬은 다음과 같다:

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

여기서 $s\_x$와 $s\_y$는 각각 x축과 y축 방향으로의 스케일링 팩터이다. 어떤 점 $\mathbf{p} = \begin{bmatrix} x \ y \ 1 \end{bmatrix}$에 이 변환을 적용하면 스케일링된 점 $\mathbf{p'}$는 다음과 같이 계산된다:

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

**회전 (Rotation)**

점 $(x, y)$를 원점 중심으로 $\theta$만큼 회전시키는 동차좌표 변환 행렬은 다음과 같다:

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

어떤 점 $\mathbf{p} = \begin{bmatrix} x \ y \ 1 \end{bmatrix}$에 이 변환을 적용하면 회전된 점 $\mathbf{p'}$는 다음과 같이 계산된다:

$$
\mathbf{p'} = \mathbf{R} \mathbf{p} = \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}
$$

#### 동차좌표 변환의 합성

동차좌표계의 큰 장점 중 하나는 여러 변환을 간단히 행렬 곱셈으로 합성할 수 있다는 점이다. 예를 들어, 점 $(x, y)$를 먼저 스케일링하고 그다음 회전시키려면, 각 변환 행렬을 순서대로 곱하여 새로운 변환 행렬을 얻을 수 있다:

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

따라서 변환된 점 $\mathbf{p'}$는 다음과 같이 계산된다:

$$
\mathbf{p'} = \mathbf{M} \mathbf{p} = (\mathbf{R} \mathbf{S}) \mathbf{p}
$$

이와 같이 동차좌표 변환을 합성하여 사용하면, 여러 개의 복잡한 변환도 한 번의 행렬 연산으로 간단히 처리할 수 있다.

#### 일반적인 예시

아래는 실습을 위한 간단한 예시이다. 주어진 점 $\mathbf{p} = (2, 3)$을 $\theta = 90^\circ$만큼 회전시키고, $(4, 2)$만큼 평행이동시키는 과정을 살펴보겠다.

회전 변환 행렬:

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

평행이동 변환 행렬:

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

점 $\mathbf{p}$의 동차좌표:

$$
\mathbf{p} = \begin{bmatrix} 2 \ 3 \ 1 \end{bmatrix}
$$

단계별 변환:

1. 회전:

$$
\mathbf{p'} = \mathbf{R} \mathbf{p} = \begin{bmatrix} 0 & -1 & 0 \ 1 & 0 & 0 \ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 2 \ 3 \ 1 \end{bmatrix} = \begin{bmatrix} -3 \ 2 \ 1 \end{bmatrix}
$$

2. 평행이동:

$$
\mathbf{p''} = \mathbf{T} \mathbf{p'} = \begin{bmatrix} 1 & 0 & 4 \ 0 & 1 & 2 \ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} -3 \ 2 \ 1 \end{bmatrix} = \begin{bmatrix} 1 \ 4 \ 1 \end{bmatrix}
$$

따라서 최종 변환된 점은 $(1, 4)$이다.
