단일 Matrix 개체는 단일 변환 또는 변환 시퀀스를 저장할 수 있습니다. 후자를 복합 변환이라고 합니다. 복합 변환의 행렬은 개별 변환의 행렬을 곱하여 가져옵니다.
복합 변환 예제
복합 변환에서 개별 변환의 순서가 중요 합니다. 예를 들어, 먼저 회전한 다음 크기를 조정하고 그 다음 이동하는 경우와, 먼저 이동한 다음 회전하고 그 다음 크기를 조정하는 경우는 다른 결과를 얻을 수 있습니다. GDI+에서 복합 변환은 왼쪽에서 오른쪽으로 빌드됩니다. S, R 및 T가 각각 배율, 회전 및 변환 행렬인 경우 제품 SRT(해당 순서)는 먼저 배율을 조정한 다음 회전한 다음 변환하는 복합 변환의 행렬입니다. 제품 SRT에서 생성된 행렬은 제품 TRS에서 생성된 행렬과 다릅니다.
순서가 중요한 이유 중 하나는 회전 및 크기 조정과 같은 변환이 좌표계의 원점과 관련하여 수행되기 때문입니다. 원점에서 가운데에 있는 개체의 크기를 조정하면 원점에서 멀리 이동된 개체의 크기를 조정하는 것과 다른 결과가 생성됩니다. 마찬가지로 원점에서 가운데에 있는 개체를 회전하면 원점에서 멀리 이동된 개체를 회전하는 것과 다른 결과가 생성됩니다.
다음 예제에서는 크기 조정, 회전 및 변환(해당 순서)을 결합하여 복합 변환을 형성합니다. RotateTransform 메서드로 전달된 Append 인수는 스케일링 후 회전이 진행됨을 나타냅니다. 마찬가지로, TranslateTransform 메서드로 전달된 Append 인수는 회전 후 변환이 진행됨을 나타냅니다. Append 및 Prepend는 MatrixOrder 열거의 멤버입니다.
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)
복합 변환에서 개별 변환 순서를 역전시키는 한 가지 방법은 메서드 호출 시퀀스의 순서를 역전시키는 것입니다. 작업 순서를 제어하는 두 번째 방법은 행렬 순서 인수를 변경하는 것입니다. 다음 예제는 앞의 예제와 동일하지만, Append가 Prepend로 변경되었습니다. 행렬 곱셈은 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)
바로 앞 예제의 결과는 이 항목의 첫 번째 예제 결과와 동일합니다. 메서드 호출 순서와 행렬 곱셈 순서를 모두 취소했기 때문입니다.
참고하십시오
.NET Desktop feedback