Partilhar via


Por que a ordem de transformação é significativo

Um único Matrix objeto pode armazenar uma única transformação ou uma sequência de transformações. O segundo é chamado de uma transformação composta.A matriz de uma transformação composta é obtida multiplicando as matrizes de transformações individuais.

Exemplos de transformação composto

Em uma transformação composta, a ordem das transformações individuais é importante.Por exemplo, se você primeiro girar, e, em seguida, dimensiona e, em seguida, converter, obterá um resultado diferente de se pela primeira vez, traduzir, em seguida, girar e, em seguida, dimensionar.In GDI+, compostas transformações são criadas da esquerda para direita. Se T, R e S matrizes de escala, rotação e tradução respectivamente, em seguida, o produto SRT (nessa ordem) é a matriz de transformação composta que dimensiona primeiro, em seguida, gira e, em seguida, converte.A matriz produzida pelo produto SRT é diferente da matriz produzida pelo produto TRS.

Um motivo ordem é importante é que são transformações, como rotação e dimensionamento concluído com relação à origem de sistema de coordenada.Dimensionar um objeto que está centralizado na origem produz um resultado diferente de dimensionar um objeto foi movido para fora de origem.Da mesma forma, girar um objeto que está centralizado na origem produz um resultado diferente de girar um objeto foi movido para fora de origem.

O exemplo a seguir combina dimensionamento, rotação e conversão (em ordem) para formar uma transformação composta.O argumento Append passado para o RotateTransform método indica que a rotação seguem o dimensionamento. Da mesma forma, o argumento Append passado para o TranslateTransform método indica que a tradução seguirá a rotação. Append e Prepend são membros do MatrixOrder enumeração.

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.ScaleTransform(1.75f, 0.5f);
e.Graphics.RotateTransform(28, MatrixOrder.Append);
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append);
e.Graphics.DrawRectangle(pen, rect);

O exemplo a seguir torna sistema autônomo chamadas de método mesmo do exemplo anterior, mas a ordem das chamadas é invertida.A ordem das operações resultante traduzir pela primeira vez, e, em seguida, girar, e, em seguida, escala, que produz um resultado que a primeira escala muito diferente, em seguida, girar e converter.

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)

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);

Uma maneira para inverter a ordem das transformações individuais em uma transformação composta é inverter a ordem de uma sequência de chamadas de método.Uma segunda maneira de controlar a ordem das operações é alterar o argumento de ordem de matriz.O exemplo a seguir é igual ao exemplo anterior, exceto que Append foi alterado para Prepend. A multiplicação de matriz é feita na ordem de SRT, onde S, R e T são matrizes para dimensionar, girar e traduzem, respectivamente.A ordem de transformação composta é a primeira escala e, em seguida, girar e converter.

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)

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);

O resultado do exemplo imediatamente anterior é o mesmo sistema autônomo resultado do primeiro exemplo neste tópico.Isso é porque nós reverter a ordem das chamadas de método e a ordem de multiplicação de matriz.

Consulte também

Referência

Matrix

Outros recursos

Sistemas de coordenada e transformações

Usando transformações no gerenciado GDI +