변환에 대한 매트릭스 표현
m×n 행렬은 m 행과 n열로 정렬된 숫자 집합입니다. 다음 그림에서는 여러 행렬을 보여줍니다.
개별 요소를 추가하여 동일한 크기의 두 행렬을 추가할 수 있습니다. 다음 그림에서는 행렬 추가의 두 가지 예를 보여줍니다.
m×n 행렬을 n×p 행렬로 곱할 수 있으며 결과는 m×p 행렬입니다. 첫 번째 행렬의 열 수는 두 번째 행렬의 행 수와 같아야 합니다. 예를 들어 4 ×2 행렬을 2 ×3 행렬을 곱하여 4 ×3 행렬을 생성할 수 있습니다.
평면의 점과 행렬의 행과 열을 벡터로 생각할 수 있습니다. 예를 들어, (2, 5)는 두 개의 구성 요소가 있는 벡터이고 (3, 7, 1)은 세 개의 구성 요소가 있는 벡터입니다. 두 벡터의 점 곱은 다음과 같이 정의됩니다.
(a, b) • (c, d) = ac + bd
(a, b, c) • (d, e, f) = ad + be + cf
예를 들어, (2, 3) 및 (5, 4)의 점 곱은 (2)(5) + (3)(4) = 22입니다. (2, 5, 1) 및 (4, 3, 1)의 점 곱은 (2)(4) + (5)(3) + (1)(1) = 24입니다. 두 벡터의 점 곱은 다른 벡터가 아닌 숫자입니다. 또한 두 벡터의 구성 요소 수가 동일한 경우에만 점 제품을 계산할 수 있습니다.
A(i, j)가 i번째 행과 j번째 열의 행렬 A에 있는 항목이 되도록합니다 . 예를 들어 A(3, 2)는 3rd 행의 행렬 A와 2번째 열의 항목입니다. A, B 및 C가 행렬이고 AB = C라고 가정합니다. C의 항목은 다음과 같이 계산됩니다.
C(i, j) = (A의 행 i) • (B의 열 j)
다음 그림에서는 행렬 곱하기의 몇 가지 예를 보여줍니다.
평면의 점을 1 × 2 행렬로 생각하면 해당 점을 2 × 2 행렬로 곱하여 변환할 수 있습니다. 다음 그림에서는 점(2, 1)에 적용된 여러 변환을 보여줍니다.
이전 그림에 표시된 모든 변환은 선형 변환입니다. 번역과 같은 특정 다른 변환은 선형이 아니며 2 × 2 행렬을 곱한 것으로 표현할 수 없습니다. 점(2, 1)으로 시작하고, 90도 회전하고, x 방향으로 3단위를 이동하고, y 방향으로 4단위를 이동하려는 경우를 가정해 보겠습니다. 행렬 곱하기와 행렬 추가를 수행하여 이 작업을 수행할 수 있습니다.
선형 변환(2× 2 행렬 곱하기) 뒤에 변환(1×2 행렬 추가)을 아핀 변환이라고 합니다. 행렬 쌍에 아핀 변환을 저장하는 대신(선형 부분과 변환용으로 하나) 전체 변환을 3 × 3 행렬에 저장하는 것입니다. 이 작업을 수행하려면 평면의 점이 더미 3번째 좌표가 있는 1 × 3 행렬에 저장되어야 합니다. 일반적인 기술은 모든 세 번째 좌표를 1이 되도록 하는 것입니다. 예를 들어 점(2, 1)은 행렬 [2 1 1]로 표시됩니다. 다음 그림에서는 단일 3개의 × 3 행렬을 곱하여 표현된 아핀 변환(90도 회전, x 방향으로 3개 단위 변환, y 방향의 4단위)을 보여 줍니다.
이전 예제에서 점(2, 1)은 점(2, 6)에 매핑됩니다. 3 × 3 행렬의 세 번째 열에는 숫자 0, 0, 1이 포함됩니다. 이것은 항상 아핀 변환의 3 × 3 행렬의 경우입니다. 중요한 숫자는 열 1과 2의 6개 숫자입니다. 행렬의 왼쪽 위 2개 × 2개 부분은 변환의 선형 부분을 나타내고, 3번째 행의 처음 두 항목은 변환을 나타냅니다.
Windows GDI+에서는 Matrix 개체에 아핀 변환을 저장할 수 있습니다. 아핀 변환을 나타내는 행렬의 세 번째 열은 항상(0, 0, 1) 이므로 Matrix 개체를 생성할 때 처음 두 열에서 6개의 숫자만 지정합니다. 문 Matrix myMatrix(0.0f, 1.0f, -1.0f, 0.0f, 3.0f, 4.0f);
은 이전 그림에 표시된 행렬을 생성합니다.
복합 변형
복합 변환은 변환 시퀀스이며, 순서대로 되어 있습니다. 다음 목록의 행렬 및 변환을 고려합니다.
- 행렬 A 회전 90도
- 행렬 B x 방향에서 2의 배율로 크기 조정
- 행렬 C y 방향으로 3단원 변환
행렬 [2 1 1]로 표시된 점(2, 1)으로 시작하고 A, B, C를 곱하면 점(2,1)이 나열된 순서대로 세 가지 변환을 거칩니다.
[2 1 1] ABC = [ –2 5 1]
복합 변환의 세 부분을 별도의 세 행렬에 저장하는 대신 A, B 및 C를 함께 곱하여 전체 복합 변환을 저장하는 단일 3 × 3 행렬을 가져올 수 있습니다. ABC = D라고 가정합니다. 그런 다음 D를 곱한 점은 A, B, C를 곱한 점과 동일한 결과를 제공합니다.
[2 1 1] D = [ –2 5 1]
다음 그림에서는 행렬 A, B, C 및 D를 보여줍니다.
개별 변환 매트릭스를 곱하여 복합 변환의 행렬을 구성할 수 있다는 사실은 모든 아핀 변환 시퀀스를 단일 Matrix 개체에 저장할 수 있음을 의미합니다.
참고
복합 변환의 순서는 중요합니다. 일반적으로, 회전, 스케일링, 이동 순서는 스케일링, 회전, 이동 순서와 같지 않습니다. 마찬가지로, 행렬 곱하기 순서도 중요합니다. 일반적으로 ABC는 BAC와 동일하지 않습니다.
Matrix 클래스는 복합 변환을 빌드하기 위한 여러 메서드를 제공합니다. Matrix::Multiply, Matrix::Rotate, Matrix::RotateAt, Matrix::Scale, Matrix::Shear 및 Matrix::Translate. 다음 예제에서는 먼저 30도 회전한 다음 y 방향으로 2의 배율을 조정한 다음 x 방향으로 5 단위를 변환하는 복합 변환의 행렬을 만듭니다.
Matrix myMatrix;
myMatrix.Rotate(30.0f);
myMatrix.Scale(1.0f, 2.0f, MatrixOrderAppend);
myMatrix.Translate(5.0f, 0.0f, MatrixOrderAppend);
다음 그림은 행렬을 보여줍니다.