아핀 변환(affine transformation)은 2차원과 3차원 모두에서 일반적으로 사용되는 변환 중 하나이다. 이러한 변환은 평행성을 보존하며, 회전, 이동, 확대/축소, 그리고 전단(shear) 등의 변환을 포함한다. 아핀 변환은 수학적으로 행렬로 표현되기 때문에 동차 좌표(homogeneous coordinates) 체계를 통해 보다 일관되고 간단하게 표현할 수 있다.

동차좌표

동차좌표는 유클리드 좌표를 확장한 형태로, 차원(dimension)을 하나 더 추가하여 점을 표현하는 방법이다. 예를 들어, 2차원 좌표 (x, y)는 동차좌표계에서 (x, y, w)로 표현되며, 일반적으로 w=1로 설정된다. 동차좌표를 사용하면 변환들을 행렬로 일관되게 표현할 수 있다.

2차원 아핀 변환

2차원의 아핀 변환은 3x3 행렬로 표현된다. 이 행렬은 다음과 같이 구성된다.

\mathbf{T} = \begin{bmatrix} a & b & tx \\ c & d & ty \\ 0 & 0 & 1 \end{bmatrix}

여기서 (tx, ty)는 이동 벡터이다. 이 행렬을 점 \mathbf{p} = (x, y, 1)에 적용하면 새로운 점 \mathbf{p}' = (x', y', 1)을 얻을 수 있다:

\mathbf{p}' = \mathbf{T} \mathbf{p} = \begin{bmatrix} a & b & tx \\ c & d & ty \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} ax + by + tx \\ cx + dy + ty \\ 1 \end{bmatrix}

이로써 점이 아핀 변환된 새로운 위치를 얻을 수 있다.

3차원 아핀 변환

3차원의 아핀 변환은 4x4 행렬로 표현된다. 이 행렬은 다음과 같이 구성된다.

\mathbf{T} = \begin{bmatrix} a & b & c & tx \\ d & e & f & ty \\ g & h & i & tz \\ 0 & 0 & 0 & 1 \end{bmatrix}

이 행렬을 점 \mathbf{p} = (x, y, z, 1)에 적용하면 새로운 점 \mathbf{p}' = (x', y', z', 1)을 얻을 수 있다:

\mathbf{p}' = \mathbf{T} \mathbf{p} = \begin{bmatrix} a & b & c & tx \\ d & e & f & ty \\ g & h & i & tz \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} ax + by + cz + tx \\ dx + ey + fz + ty \\ gx + hy + iz + tz \\ 1 \end{bmatrix}

이는 점이 3차원 공간에서 아핀 변환된 새로운 위치를 의미한다. 동차좌표계를 이용하면 이와 같은 아핀 변환을 통합된 방식으로 처리할 수 있으며, 변환 행렬을 연산하여 일관성 있게 여러 변환을 조합할 수 있다.

동차좌표계의 장점

동차좌표계를 사용하는 것의 주요 장점 중 하나는 변환의 일관성과 단순성이다. 다차원 행렬 연산을 통해 변환들을 쉽게 합성할 수 있으며, 변환의 순서를 간단하게 유지할 수 있다. 특히, 다중 변환을 한꺼번에 적용할 때 매우 유용하다.

변환 행렬의 합성

여러 변환을 함께 사용하는 경우, 각각의 변환 행렬을 곱하여 하나의 합성 행렬을 만들 수 있다. 예를 들어, 이동, 회전, 그리고 축소/확대 변환을 차례로 적용하고자 하는 경우, 각 변환에 대한 행렬을 곱하여 최종 변환 행렬을 얻는다. 이것은 다음과 같은 순서로 이루어진다.

  1. 이동 변환:

이동 벡터가 (tx, ty)인 2차원 이동 변환 행렬은 다음과 같다.

$$ \mathbf{T}_{\text{translate}} = \begin{bmatrix} 1 & 0 & tx \ 0 & 1 & ty \ 0 & 0 & 1 \end{bmatrix} $$

  1. 회전 변환:

회전 각도가 \theta인 2차원 회전 변환 행렬은 다음과 같다.

$$ \mathbf{T}_{\text{rotate}} = \begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 \ \sin(\theta) & \cos(\theta) & 0 \ 0 & 0 & 1 \end{bmatrix} $$

  1. 축소/확대 변환:

확장/축소 비율이 (sx, sy)인 2차원 스케일 변환 행렬은 다음과 같다.

$$ \mathbf{T}_{\text{scale}} = \begin{bmatrix} sx & 0 & 0 \ 0 & sy & 0 \ 0 & 0 & 1 \end{bmatrix} $$

최종 변환 행렬 \mathbf{T}_{\text{final}}은 이 행렬들을 곱하여 구할 수 있다.

\mathbf{T}_{\text{final}} = \mathbf{T}_{\text{translate}} \times \mathbf{T}_{\text{rotate}} \times \mathbf{T}_{\text{scale}}

연산 순서에 따라 얻어지는 결과가 달라질 수 있으므로, 필요한 순서로 행렬을 곱해야 한다.

동일한 개념은 3차원에서도 적용된다. 각 변환에 대응하는 4x4 행렬을 곱하여 최종 변환 행렬을 구하면 된다. 예를 들어, 이동, 회전, 확대/축소 변환을 차례로 적용하고자 한다면, 각 변환에 대한 행렬을 다음과 같은 순서로 곱한다.

  1. 이동 변환:

$$ \mathbf{T}_{\text{translate}} = \begin{bmatrix} 1 & 0 & 0 & tx \ 0 & 1 & 0 & ty \ 0 & 0 & 1 & tz \ 0 & 0 & 0 & 1 \end{bmatrix} $$

  1. 회전 변환 (예: Z축 기준 회전):

$$ \mathbf{T}_{\text{rotate}} = \begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 & 0 \ \sin(\theta) & \cos(\theta) & 0 & 0 \ 0 & 0 & 1 & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} $$

  1. 축소/확대 변환:

$$ \mathbf{T}_{\text{scale}} = \begin{bmatrix} sx & 0 & 0 & 0 \ 0 & sy & 0 & 0 \ 0 & 0 & sz & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} $$

최종 변환 행렬 \mathbf{T}_{\text{final}}은 다음과 같이 구할 수 있다.

\mathbf{T}_{\text{final}} = \mathbf{T}_{\text{translate}} \times \mathbf{T}_{\text{rotate}} \times \mathbf{T}_{\text{scale}}

결론적으로, 동차좌표와 행렬을 이용하면 복잡한 변환을 일관되게 처리할 수 있으며, 다양한 그래픽스 및 컴퓨터 비전 응용에서 효율적으로 사용할 수 있다.