Compartir a través de


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

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. Normalmente, las matrices se muestran con los elementos de matriz entre corchetes:

Matriz de 3 x 2.

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 columna i'th row y j'th de la matriz A.

En el diagrama siguiente se muestra una matriz i × j, con los elementos individuales de cada celda de la matriz.

una matriz con filas i y columnas j.

Operaciones de matriz

En esta sección se describen las operaciones básicas definidas en matrices.

Adición. 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:

Muestra una fórmula para la multiplicación de matriz.

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 elementocij, haga lo siguiente:

  1. Tome la fila I'ésima de A y la columna j'th de B.
  2. 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.
  3. Suma el resultado.

Este es un ejemplo de multiplicar una matriz (2 × 2) por una matriz (2 × 3).

multiplicación de matriz.

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, el operador × no está definido.

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.

matriz de identidades.

Las siguientes igualdades contienen para cualquier matriz M.

M x I = M I x M = M

Transformaciones Affine

Una transformación afín 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 la collinearidad. Si tres o más puntos se encuentran en una línea, todavía forman 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.

Muestra una transformación afín para el espacio 2D.

Si aplica la definición de multiplicación de matriz dada anteriormente, puede mostrar que el producto de dos transformaciones affine 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.

transformación affine.

where

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 el formato vectorial de fila para la coherencia con Direct2D y Direct3D.

 

En las siguientes secciones se derivan las transformaciones básicas.

Transformación de traducción

La matriz de transformación de traducción tiene el siguiente formato.

transformación de traducción.

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.

diagrama que muestra la traducción de dos puntos.

Transformación de escalado

La matriz de transformación de escalado tiene el siguiente formato.

transformación de escalado.

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.

diagrama que muestra el escalado de dos puntos.

Rotación alrededor del origen

La matriz para girar un punto alrededor del origen tiene el siguiente formato.

Muestra una fórmula para una transformación de rotación.

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.

diagrama que muestra la rotación alrededor del origen.

Con estas premisas:

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 geometry, 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 Θ. Por 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.

transformación de rotación.

Puede derivar esta matriz tomando el punto (x,y) como origen.

un diagrama que muestra la rotación alrededor de un punto.

Let (x1, y1) ser el punto resultante de girar el punto (x0, y0) alrededor del punto (x,y). Podemos derivar x1 como se indica a continuación.

x1 = (x0 – x)cosΘ– (y0 – y)sinΘ + x1 = x0cosΘ – y0sinΘ + \[ (1 – cosΘ) + ysinΘ \]

Ahora, vuelva a conectar esta ecuación a la matriz de transformación, usando la fórmula x1 = ax0 + cy0 + e de versiones anteriores. 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 que se va a sesgar 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): coordenadas x e y del punto sobre el que se realiza la asimetría.

La transformación de asimetría usa la siguiente matriz.

transformación de asimetría.

El punto transformado es:

P' = (*x* + *y*tanΘ – *py*tanΘ, *y* + *x*tanΝ) – *py*tanΝ

o de forma equivalente:

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 la asimetría del eje X.

Diagrama que muestra la asimetría a lo largo del eje X.

Este es el mismo sesgo aplicado a un rectángulo:

Diagrama que muestra la asimetría a lo largo del eje X cuando se aplica a un rectángulo.

El parámetro Ν tiene el mismo efecto, pero a lo largo del eje Y:

Diagrama que muestra la asimetría a lo largo del eje Y.

En el diagrama siguiente se muestra la asimetría del eje Y aplicada a un rectángulo.

Diagrama que muestra la asimetría a lo largo del eje Y cuando se aplica 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.

Representar transformaciones en Direct2D

Todas las transformaciones de Direct2D son transformaciones afín. Direct2D no admite transformaciones no afín. 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 afín siempre es la misma ([0, 0, 1]) y porque Direct2D no admite transformaciones no afín, no es necesario especificar la matriz completa de 3 × 3. Internamente, Direct2D usa 3 matrices × 3 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 afín básicas. La clase también define operator*() para componer dos o más transformaciones, como se describe en Aplicar transformaciones en Direct2D.

Siguientes

Módulo 4. Entrada del usuario