Transformações globais e locais

Uma transformação global é uma transformação que se aplica a cada item desenhado por um determinado Graphics objeto. Em contraste, uma transformação local é uma transformação que se aplica a um item específico a ser desenhado.

Transformações globais

Para criar uma transformação global, construa um Graphics objeto e manipule sua Transform propriedade. A Transform propriedade é um Matrix objeto, portanto, pode conter qualquer sequência de transformações afim. A transformação armazenada na Transform propriedade é chamada de transformação do mundo. A Graphics classe fornece vários métodos para construir uma transformação de mundo composto: MultiplyTransform, , RotateTransformScaleTransforme TranslateTransform. O exemplo a seguir desenha uma elipse duas vezes: uma vez antes de criar uma transformação global e outra vez depois. A transformação primeiro é dimensionada por um fator de 0,5 na direção y e, em seguida, move 50 unidades na direção x e gira 30 graus.

myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);
myGraphics.ScaleTransform(1, 0.5f);
myGraphics.TranslateTransform(50, 0, MatrixOrder.Append);
myGraphics.RotateTransform(30, MatrixOrder.Append);
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50)
myGraphics.ScaleTransform(1, 0.5F)
myGraphics.TranslateTransform(50, 0, MatrixOrder.Append)
myGraphics.RotateTransform(30, MatrixOrder.Append)
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50)

A ilustração a seguir mostra as matrizes envolvidas na transformação.

Illustration of the Scale, Translate, and Rotate matrices combining to form the global transformation.

Observação

No exemplo anterior, a elipse é girada sobre a origem do sistema de coordenadas, que está localizado no canto superior esquerdo da área de cliente. Isso produz um resultado diferente de girar a elipse sobre seu próprio centro.

Transformações locais

Uma transformação local aplica-se a um item específico a ser desenhado. Por exemplo, um objeto tem um GraphicsPathTransform método que permite transformar os pontos de dados desse caminho. O exemplo a seguir desenha um retângulo sem transformação e um caminho com uma transformação de rotação. (Suponha que não haja nenhuma transformação global.)

Matrix myMatrix = new Matrix();
myMatrix.Rotate(45);
myGraphicsPath.Transform(myMatrix);
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50);
myGraphics.DrawPath(myPen, myGraphicsPath);
Dim myMatrix As New Matrix()
myMatrix.Rotate(45)
myGraphicsPath.Transform(myMatrix)
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50)
myGraphics.DrawPath(myPen, myGraphicsPath)

Você pode combinar a transformação global com transformações locais para obter uma variedade de resultados. Por exemplo, você pode usar a transformação global para revisar o sistema de coordenadas e usar transformações locais para girar e dimensionar objetos desenhados no novo sistema de coordenadas.

Suponha que você deseje obter um sistema de coordenadas que tenha sua origem 200 pixels da borda esquerda da área de cliente e 150 pixels da parte superior da área de cliente. Além disso, suponha que você deseje que a unidade de medida seja o pixel, com o eixo x apontando para a direita e o eixo y apontando para cima. O sistema de coordenadas padrão tem o eixo y apontando para baixo, assim, você precisa executar uma reflexão no eixo horizontal. A ilustração a seguir mostra a matriz de uma reflexão assim.

Illustration of a matrix that reflects across the horizontal axis.

Em seguida, suponha que você precisa executar uma translação de 200 unidades para a direita e 150 unidades para baixo.

O exemplo a seguir estabelece o sistema de coordenadas descrito ao definir a transformação do mundo de um Graphics objeto.

Matrix myMatrix = new Matrix(1, 0, 0, -1, 0, 0);
myGraphics.Transform = myMatrix;
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append);
Dim myMatrix As New Matrix(1, 0, 0, -1, 0, 0)
myGraphics.Transform = myMatrix
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append)

O código a seguir (colocado no final do exemplo anterior) cria um caminho que consiste em um único retângulo com seu canto inferior esquerdo na origem do novo sistema de coordenadas. O retângulo é preenchido uma vez sem transformação local e uma vez com transformação local. A transformação local consiste em uma colocação em escala horizontal por um fator de 2 seguida por uma rotação de 30 graus.

// Create the path.
GraphicsPath myGraphicsPath = new GraphicsPath();
Rectangle myRectangle = new Rectangle(0, 0, 60, 60);
myGraphicsPath.AddRectangle(myRectangle);

// Fill the path on the new coordinate system.
// No local transformation
myGraphics.FillPath(mySolidBrush1, myGraphicsPath);

// Set the local transformation of the GraphicsPath object.
Matrix myPathMatrix = new Matrix();
myPathMatrix.Scale(2, 1);
myPathMatrix.Rotate(30, MatrixOrder.Append);
myGraphicsPath.Transform(myPathMatrix);

// Fill the transformed path on the new coordinate system.
myGraphics.FillPath(mySolidBrush2, myGraphicsPath);
' Create the path.
Dim myGraphicsPath As New GraphicsPath()
Dim myRectangle As New Rectangle(0, 0, 60, 60)
myGraphicsPath.AddRectangle(myRectangle)

' Fill the path on the new coordinate system.
' No local transformation
myGraphics.FillPath(mySolidBrush1, myGraphicsPath)

' Set the local transformation of the GraphicsPath object.
Dim myPathMatrix As New Matrix()
myPathMatrix.Scale(2, 1)
myPathMatrix.Rotate(30, MatrixOrder.Append)
myGraphicsPath.Transform(myPathMatrix)

' Fill the transformed path on the new coordinate system.
myGraphics.FillPath(mySolidBrush2, myGraphicsPath)

A ilustração a seguir mostra o novo sistema de coordenadas e os dois retângulos.

Illustration of the new coordinate system and the two rectangles.

Confira também