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}$에 의해 다음과 같이 대응된다:

[xy]=[xwyw]\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')$로 평행이동 하는 동차좌표 변환 행렬은 다음과 같다:

T=[10tx01ty001]\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'}$는 다음과 같이 계산된다:

p=Tp=[10tx01ty001][xy1]=[x+txy+ty1]\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)$로 스케일링하는 동차좌표 변환 행렬은 다음과 같다:

S=[sx000sy0001]\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'}$는 다음과 같이 계산된다:

p=Sp=[sx000sy0001][xy1]=[sxxsyy1]\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$만큼 회전시키는 동차좌표 변환 행렬은 다음과 같다:

R=[cosθsinθ0sinθcosθ0001]\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'}$는 다음과 같이 계산된다:

p=Rp=[cosθsinθ0sinθcosθ0001][xy1]=[xcosθysinθxsinθ+ycosθ1]\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)$를 먼저 스케일링하고 그다음 회전시키려면, 각 변환 행렬을 순서대로 곱하여 새로운 변환 행렬을 얻을 수 있다:

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

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

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

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

일반적인 예시

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

회전 변환 행렬:

R=[010100001]\mathbf{R} = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix}

평행이동 변환 행렬:

T=[104012001]\mathbf{T} = \begin{bmatrix} 1 & 0 & 4 \\ 0 & 1 & 2 \\ 0 & 0 & 1 \end{bmatrix}

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

p=[231]\mathbf{p} = \begin{bmatrix} 2 \\ 3 \\ 1 \end{bmatrix}

단계별 변환:

  1. 회전:

p=Rp=[010100001][231]=[321]\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}
  1. 평행이동:

p=Tp=[104012001][321]=[141]\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)$이다.

Last updated