Compartir a través de


Transformaciones globales y locales

Una transformación global es una transformación que se aplica a cada elemento dibujado por un objeto determinado Graphics . En cambio, 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, construya un Graphics objeto y, a continuación, manipule su Transform propiedad. La Transform propiedad es un Matrix objeto, por lo que puede contener cualquier secuencia de transformaciones afín. La transformación almacenada en la Transform propiedad se denomina transformación del mundo. La Graphics clase proporciona varios métodos para crear una transformación del mundo compuesto: MultiplyTransform, RotateTransform, ScaleTransformy TranslateTransform. En el ejemplo siguiente se dibuja una elipse dos veces: una vez antes de crear una transformación del mundo y una vez después. La transformación se escala primero por un factor de 0,5 en la dirección y, a continuación, traduce 50 unidades en la dirección x y, a continuación, gira 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 ilustración siguiente se muestran las matrices implicadas en la transformación.

Ilustración de las matrices Scale, Translate y Rotate que se combinan para formar la transformación global.

Nota:

En el ejemplo anterior, la elipse se gira sobre el origen del sistema de coordenadas, que se encuentra en la esquina superior izquierda del área de cliente. Esto produce un resultado diferente al girar la elipse sobre su propio centro.

Transformaciones locales

Una transformación local se aplica a un elemento específico que se va a dibujar. Por ejemplo, un GraphicsPath objeto tiene un Transform método que permite transformar los datos de esa ruta. En el ejemplo siguiente se dibuja un rectángulo sin transformación y una ruta de acceso con una transformación de rotación. (Supongamos que no hay ninguna transformación 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)

Puede combinar la transformación del mundo con transformaciones locales para lograr una variedad de resultados. Por ejemplo, puede usar la transformación del mundo para revisar el sistema de coordenadas y usar transformaciones locales para girar y escalar objetos dibujados en el nuevo sistema de coordenadas.

Supongamos que desea un sistema de coordenadas que tenga su origen de 200 píxeles desde el borde izquierdo del área de cliente y 150 píxeles desde 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 que apunta a la derecha y al eje Y hacia arriba. El sistema de coordenadas predeterminado tiene el eje Y que apunta hacia abajo, por lo que debe realizar una reflexión en el eje horizontal. En la ilustración siguiente se muestra la matriz de este tipo de reflexión.

Ilustración de una matriz que refleja en el eje horizontal.

A continuación, supongamos que necesita realizar una traducción de 200 unidades a la derecha y 150 unidades hacia abajo.

En el ejemplo siguiente se establece el sistema de coordenadas que acaba de describir estableciendo la transformación mundial de un Graphics objeto.

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)

El código siguiente (colocado al final del ejemplo anterior) crea una ruta de acceso que consta de un único rectángulo con su esquina inferior izquierda en el origen del nuevo sistema de coordenadas. El rectángulo se rellena una vez sin transformación local y una vez con una transformación local. La transformación local consta de un escalado horizontal por un factor de 2 seguido de un giro de 30 grados.

// 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)

En la ilustración siguiente se muestra el nuevo sistema de coordenadas y los dos rectángulos.

Ilustración del nuevo sistema de coordenadas y los dos rectángulos.

Consulte también