Representación matricial de transformaciones
Una matriz de m×n es un conjunto de números organizados en m filas y n columnas. En la ilustración siguiente se muestran varias matrices.
Puede agregar dos matrices del mismo tamaño agregando elementos individuales. En la ilustración siguiente se muestran dos ejemplos de suma de matrices.
Una matriz de m×n se puede multiplicar por una matriz de n×p y el resultado es una matriz m×p. El número de columnas de la primera matriz debe ser el mismo que el número de filas de la segunda matriz. Por ejemplo, una matriz de 4×2 se puede multiplicar por una matriz de 2×3 para generar una matriz 4×3.
Los puntos del plano y las filas y columnas de una matriz pueden considerarse vectores. Por ejemplo, (2, 5) es un vector con dos componentes y (3, 7, 1) es un vector con tres componentes. El producto escalar de dos vectores se define de la siguiente manera:
(a, b) • (c, d) = ac + bd
(a, b, c) • (d, e, f) = ad + be + cf
Por ejemplo, el producto escalar de (2, 3) y (5, 4) es (2)(5) + (3)(4) = 22. El producto escalar de (2, 5, 1) y (4, 3, 1) es (2)(4) + (5)(3) + (1)(1) = 24. Tenga en cuenta que el producto escalar de dos vectores es un número, no otro vector. Tenga en cuenta también que solo puede calcular el producto escalar si los dos vectores tienen el mismo número de componentes.
Sea A(i, j) la entrada de la matriz A en la fila i-ésima y la columna j-ésima. Por ejemplo, A(3, 2) es la entrada de la matriz A en la tercera fila y la segunda columna. Supongamos que A, B y C son matrices y que AB = C. Las entradas de C se calculan de la siguiente manera:
C(i, j) = (fila i de A) • (columna j de B)
En la ilustración siguiente se muestran varios ejemplos de multiplicación de matrices.
Si piensa en un punto de un plano como una matriz de 1×2, puede transformar ese punto multiplicándolo por una matriz de 2×2. En la ilustración siguiente se muestran varias transformaciones aplicadas al punto (2, 1).
Todas las transformaciones que se muestran en la ilustración anterior son transformaciones lineales. Algunas otras transformaciones, como la traducción, no son lineales y no se pueden expresar como multiplicación por una matriz de 2×2. Supongamos que quiere empezar con el punto (2, 1), girarlo 90 grados, trasladarlo 3 unidades en la dirección x y trasladarlo 4 unidades en la dirección y. Puede hacerlo mediante una multiplicación de matrices seguida de una suma de matrices.
Una transformación lineal (multiplicación por una matriz de 2×2) seguida de una traslación (suma de una matriz de 1×2) se denomina transformación afín. Una alternativa al almacenamiento de una transformación afín en un par de matrices (una para la parte lineal y otra para la traslación) es almacenar toda la transformación en una matriz de 3×3. Para que esto funcione, un punto del plano debe almacenarse en una matriz de 1×3 con una tercera coordenada ficticia. La técnica habitual es hacer que todas las terceras coordenadas sean iguales a 1. Por ejemplo, el punto (2, 1) se representa mediante la matriz [2 1 1]. En la ilustración siguiente se muestra una transformación afín (girar 90 grados; trasladar 3 unidades en la dirección x y 4 unidades en la dirección y) expresadas como multiplicación por una sola matriz de 3×3.
En el ejemplo anterior, el punto (2, 1) se asigna al punto (2, 6). Tenga en cuenta que la tercera columna de la matriz de 3×3 contiene los números 0, 0, 1. Esto siempre será el caso de la matriz de 3×3 de una transformación afín. Los números importantes son los seis números de las columnas 1 y 2. La parte superior izquierda de 2×2 de la matriz representa la parte lineal de la transformación y las dos primeras entradas de la tercera fila representan la traslación.
En GDI+ puede almacenar una transformación afín en un objeto Matrix. Dado que la tercera columna de una matriz que representa una transformación afín siempre es (0, 0, 1), solo se especifican los seis números de las dos primeras columnas al construir un objeto Matrix. La instrucción Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4)
construye la matriz que se muestra en la ilustración anterior.
Transformaciones compuestas
Una transformación compuesta es una secuencia de transformaciones, una seguida de la otra. Tenga en cuenta las matrices y las transformaciones en la lista siguiente:
Matriz | Transformación |
---|---|
Matrix A | Girar 90 grados |
Matrix B | Escalado por un factor de 2 en la dirección x |
Matrix C | Trasladar 3 unidades en la dirección y |
Si comenzamos con el punto (2, 1), representado por la matriz [2 1 1], y multiplicamos por A, luego por B y después por C, el punto (2, 1) se somete a las tres transformaciones en el orden indicado.
[2 1 1]ABC = [-2 5 1]
En lugar de almacenar las tres partes de la transformación compuesta en tres matrices independientes, puede multiplicar A, B y C juntas para obtener una sola matriz de 3×3 que almacena toda la transformación compuesta. Supongamos que ABC = D. Entonces, un punto multiplicado por D da el mismo resultado que un punto multiplicado por A, luego por B y después por C.
[2 1 1]D = [-2 5 1]
En la ilustración siguiente se muestran las matrices A, B, C y D.
El hecho de que la matriz de una transformación compuesta se pueda formar multiplicando las matrices de transformación individuales significa que cualquier secuencia de transformaciones afines se puede almacenar en un solo objeto Matrix.
Precaución
El orden de una transformación compuesta es importante. En general, girar, luego escalar y después trasladar no es lo mismo que escalar, luego girar y después trasladar. Del mismo modo, el orden de multiplicación de matriz es importante. En general, ABC no es lo mismo que BAC.
La clase Matrix proporciona varios métodos para crear una transformación compuesta: Multiply, Rotate, RotateAt, Scale, Shear y Translate. En el ejemplo siguiente se crea la matriz de una transformación compuesta que gira primero 30 grados y luego se escala por un factor de 2 en la dirección y; por último, se traslada 5 unidades en la dirección x:
Matrix myMatrix = new Matrix();
myMatrix.Rotate(30);
myMatrix.Scale(1, 2, MatrixOrder.Append);
myMatrix.Translate(5, 0, MatrixOrder.Append);
Dim myMatrix As New Matrix()
myMatrix.Rotate(30)
myMatrix.Scale(1, 2, MatrixOrder.Append)
myMatrix.Translate(5, 0, MatrixOrder.Append)
En la siguiente ilustración se muestra la matriz.
Consulte también
.NET Desktop feedback