Compartir a través de


Importancia del orden de transformación

Un único objeto Matrix puede almacenar una sola transformación o una secuencia de transformaciones. Este último se denomina transformacióncompuesta. La matriz de una transformación compuesta se obtiene multiplicando las matrices de las transformaciones individuales.

En una transformación compuesta, el orden de las transformaciones individuales es importante. Por ejemplo, si primero gira, después escala y, a continuación, traslada, obtendrá un resultado diferente que si primero traslada, luego gira y, a continuación, escala. En Windows GDI+, las transformaciones compuestas se crean de izquierda a derecha. Si S, R y T son matrices de escala, rotación y traslación respectivamente, el producto SRT (en ese orden) es la matriz de la transformación compuesta que primero escala, luego gira y luego traslada. La matriz producida por el producto SRT es diferente de la matriz producida por el producto TRS.

Un orden con motivos es significativo, porque las transformaciones como la rotación y el escalado se realizan con respecto al origen del sistema de coordenadas. El escalado de un objeto centrado en el origen genera un resultado diferente al escalado de un objeto que se ha alejado del origen. De forma similar, la rotación de un objeto centrado en el origen genera un resultado diferente a la rotación de un objeto que se ha alejado del origen.

En el ejemplo siguiente se combinan el escalado, la rotación y la traslación (en ese orden) para formar una transformación compuesta. El argumento MatrixOrderAppend pasado al método Graphics::RotateTransform especifica que la rotación seguirá el escalado. Del mismo modo, el argumento MatrixOrderAppend pasado al método Graphics::TranslateTransform especifica que la traducción seguirá la rotación.

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.ScaleTransform(1.75f, 0.5f);
graphics.RotateTransform(28.0f, MatrixOrderAppend);
graphics.TranslateTransform(150.0f, 150.0f, MatrixOrderAppend);
graphics.DrawRectangle(&pen, rect);

En el ejemplo siguiente se realizan las mismas llamadas de método que el ejemplo anterior, pero se invierte el orden de las llamadas. El orden resultante de las operaciones se traduce primero, después gira y, a continuación, escala, lo que genera un resultado muy diferente al de la primera escala, después gira y, a continuación, traduce:

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.TranslateTransform(150.0f, 150.0f);
graphics.RotateTransform(28.0f, MatrixOrderAppend);
graphics.ScaleTransform(1.75f, 0.5f, MatrixOrderAppend);
graphics.DrawRectangle(&pen, rect);

Una manera de invertir el orden de las transformaciones individuales en una transformación compuesta es invertir el orden de una secuencia de llamadas de método. Una segunda manera de controlar el orden de las operaciones es cambiar el argumento de orden de matriz. El ejemplo siguiente es el mismo que el ejemplo anterior, excepto que MatrixOrderAppend se ha cambiado a MatrixOrderPrepend. La multiplicación de matriz se realiza en el orden SRT, donde S, R y T son las matrices de escala, rotación y traslación, respectivamente. El orden de la transformación compuesta es primero escalar, luego girar y, a continuación, trasladar.

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.TranslateTransform(150.0f, 150.0f,MatrixOrderPrepend);
graphics.RotateTransform(28.0f, MatrixOrderPrepend);
graphics.ScaleTransform(1.75f, 0.5f, MatrixOrderPrepend);
graphics.DrawRectangle(&pen, rect);

El resultado del ejemplo anterior es el mismo resultado que logramos en el primer ejemplo de esta sección. Esto se debe a que se invierte el orden de las llamadas de método y el orden de la multiplicación de la matriz.