다음을 통해 공유


변형 순서의 중요성

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

복합 변환 예제

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

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

다음 예제에서는 스케일링, 회전 및 변환을 순서대로 결합하여 복합 변환을 형성합니다. RotateTransform 메서드로 전달된 Append 인수는 스케일링 후 회전이 진행됨을 나타냅니다. 마찬가지로, TranslateTransform 메서드로 전달된 Append 인수는 회전 후 변환이 진행됨을 나타냅니다. AppendPrependMatrixOrder 열거의 멤버입니다.

Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.RotateTransform(28, MatrixOrder.Append);
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append);
e.Graphics.DrawRectangle(pen, rect);
Dim rect As New Rectangle(0, 0, 50, 50)
Dim pen As New Pen(Color.FromArgb(128, 200, 0, 200), 2)
e.Graphics.ResetTransform()
e.Graphics.ScaleTransform(1.75F, 0.5F)
e.Graphics.RotateTransform(28, MatrixOrder.Append)
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append)
e.Graphics.DrawRectangle(pen, rect)

다음 예제에서는 앞의 예제와 동일한 메서드를 호출하지만, 호출 순서는 역방향입니다. 작업의 결과 순서는 변환, 회전, 스케일링 순서이며, 이것은 스케일링, 회전, 변환 순서의 작업과 매우 다른 결과를 생성합니다.

Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append);
e.Graphics.RotateTransform(28, MatrixOrder.Append);
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.DrawRectangle(pen, rect);
Dim rect As New Rectangle(0, 0, 50, 50)
Dim pen As New Pen(Color.FromArgb(128, 200, 0, 200), 2)
e.Graphics.ResetTransform()
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append)
e.Graphics.RotateTransform(28, MatrixOrder.Append)
e.Graphics.ScaleTransform(1.75F, 0.5F)
e.Graphics.DrawRectangle(pen, rect)

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

Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Prepend);
e.Graphics.RotateTransform(28, MatrixOrder.Prepend);
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.DrawRectangle(pen, rect);
Dim rect As New Rectangle(0, 0, 50, 50)
Dim pen As New Pen(Color.FromArgb(128, 200, 0, 200), 2)
e.Graphics.ResetTransform()
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Prepend)
e.Graphics.RotateTransform(28, MatrixOrder.Prepend)
e.Graphics.ScaleTransform(1.75F, 0.5F)
e.Graphics.DrawRectangle(pen, rect)

바로 앞 예제의 결과는 이 항목의 첫 번째 예제 결과와 동일합니다. 이는 메서드 호출의 순서와 행렬 곱셈 순서를 모두 역전시켰기 때문입니다.

참고 항목