Transformações global e locais
Uma transformação global é uma transformação que se aplica a todos os itens desenhados por um determinado Graphics objeto. Por outro lado, uma transformação local é uma transformação que se aplica a um item específico a ser desenhada.
Transformações global
Para criar uma transformação global, construir um Graphics objeto e, em seguida, manipular seu Transform propriedade. The Transform propriedade é uma Matrix objeto, para que ele pode armazenar qualquer sequência de transformações afim. A transformação armazenada na Transform propriedade denomina-se transformação global. The Graphics classe fornece vários métodos para a criação de uma transformação global composto: MultiplyTransform, RotateTransform, ScaleTransform, e TranslateTransform. O exemplo a seguir desenha uma elipse duas vezes: uma vez antes de criar uma transformação global e uma vez após.A transformação dimensiona primeiro por um fator de 0,5 na direção y, e, em seguida, converte 50 unidades na direção x e gira 30 graus, em seguida.
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 coordenada, que está localizado no canto superior esquerdo da área de cliente.Isso produz um resultado diferente de elipse sobre sua própria centralizar de rotação. |
Transformações 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 pontos de dados do caminho. O exemplo a seguir desenha um retângulo com Nenhuma transformação e um caminho com uma transformação de rotação.(Suponha que não haja nenhuma transformação global).
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 agrupar transformação global com transformações locais para atingir uma variedade de resultados.Por exemplo, você pode usar transformação global para revisar o sistema de coordenada e transformações locais para girar e dimensionar objetos desenhados no novo sistema de coordenada.
Suponha que você queira que um sistema de coordenada que tenha suas 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ê deseja que a unidade de medida seja pixel, com o eixo x apontando para a direita e eixo y apontando para cima.O sistema de coordenada padrão tem o eixo y apontando para baixo, para que você precise executar um reflexão no eixo horizontal.A ilustração a seguir mostra a matriz de tal um reflexão.
Em seguida, suponha que você precisa executar uma conversão de 200 unidades para a direita e unidades de 150 para baixo.
O exemplo a seguir estabelece o sistema de coordenada que acabamos de descrever, definindo transformação global 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 participante do exemplo anterior) cria um caminho que consiste em um único retângulo com seu canto inferior esquerdo na origem do novo sistema de coordenada.O retângulo é preenchido uma vez com Nenhuma 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 coordenada e os dois retângulos.