Transformações globais e locais
Uma transformação global é uma transformação que se aplica a todos os itens desenhados por um determinado Graphics objeto. Em contraste, uma transformação local é uma transformação que se aplica a um item específico a ser desenhada.
Transformações globais
Para criar uma transformação global, construir um Graphics de objeto e, em seguida, manipular seu Transform propriedade. O Transform propriedade é um Matrix o objeto, para que ele pode armazenar qualquer seqüência de transformações afim. A transformação é armazenado nas Transform é chamada de propriedade da transformação do mundo. O Graphics classe fornece vários métodos para a criação de uma transformação do mundo composto: MultiplyTransform, RotateTransform, ScaleTransform, and TranslateTransform. O exemplo a seguir desenha uma elipse duas vezes: uma vez antes de criar uma transformação do mundo e uma vez após. A transformação primeiro dimensiona por um fator de 0,5 na direção y, em seguida, converte 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 envolvidos na transformação.
Observação |
---|
No exemplo anterior, a elipse é girada sobre a origem do sistema de coordenadas, que está localizado no canto superior esquerdo da área do cliente. Isso produz um resultado diferente que a elipse sobre a sua própria central de rotação. |
Transformações de locais
Uma transformação local se aplica a um item específico a ser desenhada. Por exemplo, um GraphicsPath o objeto tem um Transform 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. (Assumem que não há nenhuma transformação do mundo).
Dim myMatrix As New Matrix()
myMatrix.Rotate(45)
myGraphicsPath.Transform(myMatrix)
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50)
myGraphics.DrawPath(myPen, myGraphicsPath)
Matrix myMatrix = 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 atingir uma variedade de resultados. Por exemplo, você pode usar a transformação do mundo para revisar o sistema de coordenadas e transformações de locais para girar e dimensionar objetos desenhados no novo sistema de coordenadas.
Suponha que você deseja que um sistema de coordenadas que tem seus 200 pixels de origem da borda esquerda da área do cliente e 150 pixels da parte superior da área cliente. Além disso, suponha que você deseja que a unidade de medida a ser pixel, com o eixo x apontando para a direita e eixo y apontando para cima. O sistema de coordenadas padrão tem o eixo y apontando para baixo, para que você precise executar um reflexo no eixo horizontal. A ilustração a seguir mostra a matriz de tal um reflexo.
Em seguida, suponha que você precisa executar unidades de 200 uma tradução para a direita e 150 para baixo.
O exemplo a seguir estabelece o sistema de coordenadas que acabamos de descrever, definindo a transformação do mundo de um Graphics objeto.
Dim myMatrix As New Matrix(1, 0, 0, -1, 0, 0)
myGraphics.Transform = myMatrix
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append)
Matrix myMatrix = 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 com uma vez sem transformação local e uma vez com uma transformação local. A transformação local consiste em um dimensionamento horizontal por um fator de 2, seguido de uma rotação de 30 graus.
' 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)
// 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);
A ilustração a seguir mostra o novo sistema de coordenadas e os dois retângulos.