Transformaciones globales y locales
Una transformación global es una transformación que se aplica a todos los elementos dibujados por un objeto Graphics determinado. Por el contrario, una transformación local es una transformación que se aplica a un elemento específico que se va a dibujar.
Transformaciones globales
Para crear una transformación global hay que construir un objeto Graphics y, después, manipular su propiedad Transform. La propiedad Transform es un objeto Matrix, por lo que puede almacenar cualquier secuencia de transformaciones afines. La transformación que se almacena en la propiedad Transform se denomina transformación de coordenadas universales. La clase Graphics proporciona varios métodos para crear una transformación universal compuesta: MultiplyTransform, RotateTransform, ScaleTransform y TranslateTransform. En el siguiente ejemplo se dibuja una elipse dos veces: una, antes de crear una transformación de coordenadas universales y otra, después. La transformación, en primer lugar, ajusta la escala de la elipse en un factor de 0,5 en la dirección del eje, después, traslada 50 unidades la elipse en la dirección del eje x y, por último, rota la elipse 30 grados.
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);
En la siguiente ilustración se muestran las matrices que forman parte de la transformación.
Nota
En el ejemplo anterior se rota la elipse alrededor del origen del sistema de coordenadas, que está en la esquina superior izquierda del área de cliente. Esto produce un resultado diferente al de la rotación de la elipse alrededor de su propio centro.
Transformaciones locales
Una transformación local se aplica a un elemento específico que se va a dibujar. Por ejemplo, un objeto GraphicsPath tiene un método Transform que permite transformar los puntos de datos de ese trazado. En el siguiente ejemplo se dibuja un rectángulo sin transformación y un trazado con una transformación de rotación. Se supone que no hay transformación de coordenadas universales.
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);
La transformación de coordenadas universales puede combinarse con transformaciones locales para conseguir resultados diversos. Por ejemplo, la transformación de coordenadas universales puede utilizarse para revisar el sistema de coordenadas, y las transformaciones locales pueden utilizarse para rotar y ajustar la escala de objetos dibujados en el nuevo sistema de coordenadas.
Supongamos que desea que el sistema de coordenadas tenga el origen a 200 píxeles del borde izquierdo del área de cliente y a 150 píxeles de la parte superior del área de cliente. Además, supongamos que desea que la unidad de medida sea el píxel, con el eje x apuntando hacia la derecha y el eje y hacia arriba. El sistema de coordenadas predeterminado tiene el eje y apuntando hacia abajo, así que es necesario realizar una reflexión a través del eje horizontal. En la siguiente ilustración se muestra la matriz de dicha reflexión.
A continuación, supongamos que es necesario realizar una traslación de 200 unidades hacia la derecha y 150 unidades hacia abajo.
En el siguiente ejemplo se establece el sistema de coordenadas descrito mediante el establecimiento de la transformación de coordenadas universales de un objeto Graphics.
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);
En el siguiente código (ubicado al final del ejemplo anterior) se crea un trazado formado por un rectángulo único con la esquina inferior izquierda en el origen del nuevo sistema de coordenadas. El rectángulo se ha rellenado una vez sin transformación local y otra vez con una transformación local. La transformación local está compuesta por un ajuste de escala horizontal en un factor de 2 seguido de una rotación de 30 grados.
' 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);
En la siguiente ilustración se muestra el nuevo sistema de coordenadas y los dos rectángulos.