Apéndice: Transformaciones de matriz
En este tema se proporciona información general matemática sobre las transformaciones de matriz para gráficos 2D. Sin embargo, no es necesario conocer las matemáticas de matriz para usar transformaciones en Direct2D. Lea este tema si está interesado en las matemáticas; De lo contrario, no dude en omitir este tema.
- Introducción a matrices
-
transformaciones de Affine
- de transformación de traducción de
- de transformación de escalado de
- rotación alrededor del de origen
- rotación alrededor de un de punto arbitrario
- de transformación de asimetría
- que representan transformaciones en direct2D
- siguiente
Introducción a matrices
Una matriz es una matriz rectangular de números reales. El orden de la matriz es el número de filas y columnas. Por ejemplo, si la matriz tiene 3 filas y 2 columnas, el orden es 3 × 2. Las matrices normalmente se muestran con los elementos de matriz entre corchetes:
Notación: una matriz se designa mediante una letra mayúscula. Los elementos se designan mediante letras minúsculas. Los subíndices indican el número de fila y columna de un elemento. Por ejemplo, unij es el elemento de la fila i'th y j'th columna de la matriz A.
En el diagrama siguiente se muestra una matriz i × j, con los elementos individuales de cada celda de la matriz.
Operaciones de matriz
En esta sección se describen las operaciones básicas definidas en matrices.
Adición de. La suma A + B de dos matrices se obtiene agregando los elementos correspondientes de A y B:
- A + B = \[ a*ij* \] + \[ b*ij* \] = \[ a*ij* + b*ij* \]
multiplicación escalar. Esta operación multiplica una matriz por un número real. Dado un número real k, el producto escalar kA se obtiene multiplicando cada elemento de A por k.
- kA = k\[ a*ij* \] = \[ k × a*ij* \]
multiplicación de matriz. Dadas dos matrices A y B con orden (m × n) y (n × p), el producto C = A × B es una matriz con orden (m × p), definido de la siguiente manera:
o, de forma equivalente:
- c*ij* = a*i*1 x b1*j* + a*i*2 x b2*j* + ... + a*in* + b*nj*
Es decir, para calcular cada elemento cij, haga lo siguiente:
- Tome la fila i'ésima de A y la columna j'th de B.
- Multiplique cada par de elementos de la fila y columna: la primera entrada de fila por la primera entrada de columna, la segunda entrada de fila por la segunda entrada de columna, etc.
- Suma el resultado.
Este es un ejemplo de multiplicar una matriz (2 × 2) por una matriz (2 × 3).
La multiplicación de matriz no es conmutativa. Es decir, A × B ≠ B × A. Además, a partir de la definición, sigue que no se pueden multiplicar todos los pares de matrices. El número de columnas de la matriz izquierda debe ser igual al número de filas de la matriz derecha. De lo contrario, no se define el operador ×.
Identificar matriz. Una matriz de identidad, designada I, es una matriz cuadrada definida de la siguiente manera:
- I*ij* = 1 si *i* = *j*, o 0 de lo contrario.
En otras palabras, una matriz de identidad contiene 1 para cada elemento donde el número de fila es igual al número de columna y cero para todos los demás elementos. Por ejemplo, esta es la matriz de identidades 3 × 3.
Las siguientes igualdades contienen para cualquier matriz M.
- M x I = M I x M = M
Transformaciones de Affine
Una transformación affine es una operación matemática que asigna un espacio de coordenadas a otro. En otras palabras, asigna un conjunto de puntos a otro conjunto de puntos. Las transformaciones Affine tienen algunas características que las hacen útiles en los gráficos informáticos.
- Las transformaciones Affine conservan collinearidad. Si tres o más puntos se encuentran en una línea, siguen formando una línea después de la transformación. Las líneas rectas permanecen rectas.
- La composición de dos transformaciones afín es una transformación afín.
Las transformaciones Affine para el espacio 2D tienen la siguiente forma.
Si aplica la definición de multiplicación de matriz dada anteriormente, puede mostrar que el producto de dos transformaciones afín es otra transformación afín. Para transformar un punto 2D mediante una transformación afín, el punto se representa como una matriz de 1 × 3.
- P = \| x y 1 \|
Los dos primeros elementos contienen las coordenadas x e y del punto. El 1 se coloca en el tercer elemento para que las matemáticas funcionen correctamente. Para aplicar la transformación, multiplique las dos matrices de la siguiente manera.
- P' = P × M
Esto se expande a lo siguiente.
Dónde
- x' = ax + cy + e y' = bx + dy + f
Para obtener el punto transformado, tome los dos primeros elementos de la matriz P'.
- p = (x', y') = (ax + cy + e, bx + dy + f)
Nota
Una matriz de 1 × n se denomina vector de fila . Direct2D y Direct3D usan vectores de fila para representar puntos en el espacio 2D o 3D. Puede obtener un resultado equivalente mediante un vector de columna (n × 1) y transponer la matriz de transformación. La mayoría de los textos gráficos usan la forma vectorial de columna. En este tema se presenta la forma vectorial de fila para la coherencia con Direct2D y Direct3D.
En las secciones siguientes se derivan las transformaciones básicas.
Transformación de traducción
La matriz de transformación de traducción tiene la siguiente forma.
Conectar un punto P a esta ecuación produce:
- P' = (*x* + *dx*, *y* + *dy*)
que corresponde al punto (x, y) traducido por dx en el eje X y dy en el eje Y.
Transformación de escalado
La matriz de transformación de escalado tiene el formato siguiente.
Conectar un punto P a esta ecuación produce:
- P' = (*x* * * *dx*, *y* * * *dy*)
que corresponde al punto (x,y) escalado por dx y dy.
Rotación alrededor del origen
La matriz para girar un punto alrededor del origen tiene la siguiente forma.
El punto transformado es:
- P' = (*x*cosΘ – ysinΘ, *x*sinΘ + *y*cosΘ)
Prueba. Para mostrar que P' representa una rotación, tenga en cuenta el siguiente diagrama.
Dado:
-
P = (x,y)
-
Punto original que se va a transformar.
-
Φ
-
Ángulo formado por la línea (0,0) a P.
-
Θ
-
Ángulo por el que se va a girar (x,y) sobre el origen.
-
P' = (x',y')
-
Punto transformado.
-
R
-
Longitud de la línea (0,0) a P. También el radio del círculo de rotación.
Nota
En este diagrama se usa el sistema de coordenadas estándar usado en la geometría, donde el eje Y positivo apunta hacia arriba. Direct2D usa el sistema de coordenadas de Windows, donde el eje Y positivo apunta hacia abajo.
El ángulo entre el eje X y la línea (0,0) a P' es Ε + Θ. Las identidades siguientes contienen:
- x = R cosΘ y = R sinΘ x' = R cos(Θ + Θ) y' = R sin(Θ+ Θ)
Ahora resuelve x' e y' en términos de Θ. Mediante las fórmulas de suma trigonométrica:
- x' = R(cosΘcosΘ – sinΝsinΘ) = RcosΘcosΘ – RsinΝsinΘ y' = R(sinΝcosΘ + cosΝsinΘ) = RsinΘcosΘ + RcosΝsinΘ
Sustituyendo, obtenemos:
- x' = xcosΘ – ysinΘ y' = xsinΘ + ycosΘ
que corresponde al punto transformado P' mostrado anteriormente.
Rotación alrededor de un punto arbitrario
Para girar alrededor de un punto (x,y) distinto del origen, se usa la siguiente matriz.
Puede derivar esta matriz tomando el punto (x,y) para que sea el origen.
Let (x1, y1) sea el punto que resulta de girar el punto (x0, y0) alrededor del punto (x,y). Podemos derivar x1 de la siguiente manera.
- x1 = (x0 – x)cosΘ– (y0 – y)sinΘ + x1 = x0cosΘ – y0sinΘ + \[ (1 – cosΘ) + ysinΘ \]
Ahora conecte esta ecuación de nuevo a la matriz de transformación, usando la fórmula x1 = ax0 + cy0 + e de antes. Use el mismo procedimiento para derivar y1.
Transformación de asimetría
La transformación de asimetría se define mediante cuatro parámetros:
- Θ: la cantidad de asimetría a lo largo del eje X, medida como un ángulo del eje Y.
- Ν: la cantidad que se va a sesgar a lo largo del eje Y, medida como un ángulo del eje X.
- (px, py): las coordenadas x e y del punto sobre el que se realiza la asimetría.
La transformación de asimetría usa la siguiente matriz.
El punto transformado es:
- P' = (*x* + *y*tanΘ – *py*tanΘ, *y* + *x*tanΕ) – *py*tanΝ
o equivalentemente:
- P' = (*x* + (*y* – *py*)tanΘ, *y* + (*x* – *px*)tanΝ)
Para ver cómo funciona esta transformación, considere cada componente individualmente. El parámetro Θ mueve cada punto en la dirección x por una cantidad igual a tanΘ. En el diagrama siguiente se muestra la relación entre Θ y el sesgo del eje X.
Este es el mismo sesgo aplicado a un rectángulo:
El parámetro Ν tiene el mismo efecto, pero a lo largo del eje Y:
En el diagrama siguiente se muestra la asimetría del eje Y aplicada a un rectángulo.
Por último, los parámetros px y py desplazan el punto central del sesgo a lo largo de los ejes x e y.
Representación de transformaciones en Direct2D
Todas las transformaciones de Direct2D son transformaciones afín. Direct2D no admite transformaciones no affine. Las transformaciones se representan mediante la estructura D2D1_MATRIX_3X2_F. Esta estructura define una matriz de 3 × 2. Dado que la tercera columna de una transformación affine es siempre la misma ([0, 0, 1]) y, dado que Direct2D no admite transformaciones no affine, no es necesario especificar la matriz completa de 3 × 3. Internamente, Direct2D usa 3 × 3 matrices para calcular las transformaciones.
Los miembros del D2D1_MATRIX_3X2_F se denominan según su posición de índice: el miembro _11 es el elemento (1,1), el miembro _12 es el elemento (1,2), etc. Aunque puede inicializar directamente los miembros de la estructura, se recomienda usar la clase D2D1::Matrix3x2F. Esta clase hereda D2D1_MATRIX_3X2_F y proporciona métodos auxiliares para crear cualquiera de las transformaciones affine básicas. La clase también define operador*() para crear dos o más transformaciones, como se describe en Aplicar transformaciones en Direct2D.
Próximo