다음을 통해 공유


변형 순서의 중요성

단일 Matrix 개체는 단일 변환 또는 변환 시퀀스를 저장할 수 있습니다. 후자를 복합변환이라고 합니다. 복합 변환의 행렬은 개별 변환의 행렬을 곱하여 가져옵니다.

복합 변환에서는 개별 변환의 순서가 중요합니다. 예를 들어 경우 먼저 회전 다음 크기 조정, 변환, 결과 얻게 다른 보다 먼저 변환 하는 경우 다음 회전 하 고 확장 합니다. Windows GDI+에서는 복합 변환이 왼쪽에서 오른쪽으로 빌드됩니다. S, R 및 T가 각각 스케일(scale), 회전(rotation) 및 변환(translation) 행렬인 경우 (그 순서대로) 제품 SRT는 스케일링, 회전, 변환을 차례로 진행하는 복합 변환의 행렬입니다. 제품 SRT로 생성된 행렬은 제품 TRS로 생성된 행렬과 다릅니다.

순서는 중요 한 이유 등 회전 및 배율 조정 변환 좌표계의 원점을 기준으로 수행 되는 경우 원점에서 이동 된 개체 크기 조정 결과 서로 다르게 생성 원점에 중점을 두는 개체를 확장 합니다. 마찬가지로, 개체를 회전 하면 원점에 중점을 두는 원본에서 이동 된 개체를 회전 다른 결과 생성 합니다.

다음 예제에서는 스케일링, 회전 및 변환을 순서대로 결합하여 복합 변환을 형성합니다. Graphics::RotateTransform 메서드에 전달된 MatrixOrderAppend 인수는 회전이 크기 조정을 따르도록 지정합니다. 마찬가지로 Graphics::TranslateTransform 메서드에 전달된 MatrixOrderAppend 인수는 변환이 회전을 따르도록 지정합니다.

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.ScaleTransform(1.75f, 0.5f);
graphics.RotateTransform(28.0f, MatrixOrderAppend);
graphics.TranslateTransform(150.0f, 150.0f, MatrixOrderAppend);
graphics.DrawRectangle(&pen, rect);

다음 예제에서는 이전 예제와 동일한 메서드 호출을 수행하지만 호출 순서는 반전됩니다. 작업의 결과 순서는 먼저 변환한 다음, 회전한 다음, 배율을 조정하여 첫 번째 눈금과는 매우 다른 결과를 생성한 다음, 회전한 다음, 변환합니다.

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.TranslateTransform(150.0f, 150.0f);
graphics.RotateTransform(28.0f, MatrixOrderAppend);
graphics.ScaleTransform(1.75f, 0.5f, MatrixOrderAppend);
graphics.DrawRectangle(&pen, rect);

복합 변환에서 개별 변환의 순서를 되돌리는 한 가지 방법은 메서드 호출 시퀀스의 순서를 되돌리는 것입니다. 작업 순서를 제어하는 두 번째 방법은 행렬 순서 인수를 변경하는 것입니다. 다음 예제는 MatrixOrderAppendMatrixOrderPrepend로 변경되었다는 점을 제외하고 이전 예제와 동일합니다. 행렬 곱셈은 SRT 순서로 수행됩니다. 여기서 S, R, T는 각각 스케일링, 회전, 변환에 대한 행렬입니다. 복합 변환의 순서는 스케일링, 회전, 변환입니다.

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.TranslateTransform(150.0f, 150.0f,MatrixOrderPrepend);
graphics.RotateTransform(28.0f, MatrixOrderPrepend);
graphics.ScaleTransform(1.75f, 0.5f, MatrixOrderPrepend);
graphics.DrawRectangle(&pen, rect);

앞의 예제의 결과는 이 섹션의 첫 번째 예제에서 달성한 결과와 동일합니다. 이는 메서드 호출의 순서와 행렬 곱셈 순서를 모두 역전시켰기 때문입니다.