Transformações globais e locais
Uma transformação global é uma transformação que se aplica a cada item desenhado por um determinado objeto Graphics. 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 objeto Graphics e, em seguida, manipule sua propriedade Transform. A propriedade Transform é um objeto Matrix, portanto, pode conter qualquer sequência de transformações afim. A transformação armazenada na propriedade Transform é chamada de transformação do mundo. A classe Graphics fornece vários métodos para construir uma transformação de mundo composto: MultiplyTransform, RotateTransform, ScaleTransforme TranslateTransform. O exemplo a seguir desenha uma elipse duas vezes: uma antes de criar uma transformação mundial e outra depois. A transformação primeiro escala por um fator de 0,5 na direção y, depois traduz 50 unidades na direção x e, em seguida, 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.
Observação
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 em torno de 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 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 há transformação do mundo.)
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 do mundo com transformações locais para alcançar 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 a 200 pixels da borda esquerda da área do cliente e a 150 pixels da parte superior da área do cliente. Além disso, suponha que você deseja 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 realizar uma reflexão através do eixo horizontal. A ilustração a seguir mostra a matriz de tal reflexão.
Em seguida, suponha que você precise realizar uma tradução de 200 unidades para a direita e 150 unidades para baixo.
O exemplo a seguir estabelece o sistema de coordenadas descrito acima, 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 um escalonamento horizontal com um fator de 2 seguido de 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.
Ver também
.NET Desktop feedback