Compartilhar via


Por que a ordem de transformação é significativa

Um único Matrix objeto pode armazenar uma única transformação ou uma seqüê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 de composição

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

Um motivo para ordem é importante é que as transformações, como rotação e dimensionamento são feitas com relação à origem do sistema de coordenadas. Dimensionar um objeto que é centralizado na origem produz um resultado diferente de dimensionar um objeto que foi movido longe da origem. Da mesma forma, girar um objeto que é centralizado na origem produz um resultado diferente de girar um objeto que foi movido longe da origem.

O exemplo a seguir combina dimensionamento, rotação e tradução (nessa ordem) para formar uma transformação composta. O argumento Append passado para o RotateTransform método indica que a rotação seguirá o dimensionamento. Da mesma forma, o argumento Append passado para o TranslateTransform método indica que a tradução seguirá a rotação. Appende 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 faz as chamadas de método mesmo do exemplo anterior, mas a ordem das chamadas é invertida. A ordem resultante das operações traduzir pela primeira vez, e girar, e a escala, que produz um resultado muito diferente do que a primeira escala, em seguida, girar, em seguida traduzir.

        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 seqüência de chamadas de método. Uma segunda forma de controlar a ordem das operações é alterar o argumento de ordem de matriz. O exemplo a seguir é o mesmo do exemplo anterior, exceto que Append foi alterado para Prepend. A multiplicação de matriz é feita na ordem SRT, onde T, R e s são as matrizes para dimensionar, girar e traduzem, respectivamente. A ordem da transformação composta é a primeira escala, e girar, em seguida traduzir.

        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 como resultado do primeiro exemplo neste tópico. Isso ocorre porque podemos 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 coordenadas e transformações

Usando transformações no GDI+ gerenciado