Compartilhar via


Transformações globais e locais

Uma transformação global é uma transformação que se aplica a cada item desenhado por um determinado objeto Graphics. Por outro lado, 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 objeto Graphics e manipule sua propriedade Transform. A propriedade Transform é um objeto Matrix, portanto, pode conter qualquer sequência de transformações afins. A transformação armazenada na propriedade Transform é chamada de transformação mundial. A classe Graphics fornece vários métodos para criar uma transformação de mundo composto: MultiplyTransform, RotateTransform, ScaleTransforme TranslateTransform. O exemplo a seguir desenha uma elipse duas vezes: uma vez antes de criar uma transformação de mundo e uma 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.

Ilustração das matrizes Escalar, Transladar e Rotacionar, combinando-se para formar a transformação global.

Nota

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

Transformações locais

Uma transformação local se aplica a um item específico a ser desenhado. Por exemplo, um objeto GraphicsPath tem um método Transform 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 transformação mundial.)

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 mundial com transformações locais para obter uma variedade de resultados. Por exemplo, você pode usar a transformação mundial 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ê queira um sistema de coordenadas que tenha sua origem 200 pixels da borda esquerda da área do cliente e 150 pixels da parte superior da área do cliente. Além disso, suponha que você queira 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, portanto, você precisa executar uma reflexão no eixo horizontal. A ilustração a seguir mostra a matriz de tal reflexão.

Ilustração de uma matriz que reflete em todo o eixo horizontal.

Em seguida, suponha que você precise executar uma tradução de 200 unidades à direita e 150 unidades para baixo.

O exemplo a seguir estabelece o sistema de coordenadas descrito definindo a transformação mundial de um objeto Graphics.

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 uma 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.

Ilustração do novo sistema de coordenadas e dos dois retângulos.

Consulte também