He construido una pequeña aplicación C# que permite la visualización de transformaciones perpectivas con una matriz, en el espacio 2D XYW. Ahora me gustaría poder calcular la matriz a partir de las cuatro esquinas del cuadrado transformado. Aquí hay una captura de pantalla para ayudarte a entender con qué estoy trabajando:
La idea es permitir al usuario mover las esquinas del cuadrado y actualizar la matriz. Las esquinas se encuentran actualmente en (1,1), (1,-1), (-1,-1), (-1,1). ¿Existe un algoritmo que calcule una matriz de 3x3 con cuatro puntos 2D?
Si lo entiendo correctamente, cada matriz corresponde a un conjunto de cuatro puntos, y cada conjunto de cuatro puntos corresponde a una o más matrices equivalentes ("equivalente" significa "producir transformaciones idénticas").
Busqué un algoritmo para hacer esto, pero no tuve mucha suerte.
Descubrí que podía hacerlo creando ocho ecuaciones, una para cada variable en los cuatro puntos, y luego fijando uno de los valores de la matriz en uno, y resolviendo los otros ocho con álgebra. Sin embargo, las ecuaciones se vuelven demasiado complicadas para hacer todo esto con éxito en lápiz y papel.
Este es el proceso que usé para intentar que funcionara.
Así que esta es la fórmula básica de transformación de la matriz.
$ \begin {pmatrix}a & b & c \\ d & e & f \\ g & h & i \end {pmatrix} \begin {pmatrix}x \\ y \\ z \end {pmatrix}= \begin {pmatrix}ax+by+cz \\ dx+ey+fz \\ gx+hy+iz \end {pmatrix}$
El punto resultante se convierte entonces de coordenadas homogéneas a euclidiano.
$ \begin {pmatrix}x \\ y \\ z \end {pmatrix}$ = $ \begin {pmatrix} \frac {x}{z} \\ \frac {y}{z} \end {pmatrix}$
Así que dada una colección de puntos, los transformamos así.
$ \begin {pmatrix}a & b & c \\ d & e & f \\ g & h & i \end {pmatrix} \begin {pmatrix}x_{n} \\ y_{n} \\ z_{n} \end {pmatrix}= \begin {pmatrix}x'_{n} \\ y'_{n} \end {pmatrix}$
Estas son las fórmulas utilizadas para la transformación.
$x'_{n}=$$ \frac {ax_{n}+by_{n}+cz_{n}}{gx_{n}+hy_{n}+iz_{n}}$
$y'_{n}=$$ \frac {dx_{n}+ey_{n}+fz_{n}}{gx_{n}+hy_{n}+iz_{n}}$
Luego definimos cuatro puntos de base, que son las esquinas de nuestro cuadrado.
$x'_{0}=1$
$y'_{0}=1$
$z'_{0}=1$
$x'_{1}=1$
$y'_{1}=-1$
$z'_{1}=1$
$x'_{2}=-1$
$y'_{2}=-1$
$z'_{2}=1$
$x'_{3}=-1$
$y'_{3}=1$
$z'_{3}=1$
Esto nos da el siguiente sistema de ecuaciones, en la forma que nos permite determinar los puntos transformados de la matriz.
$x'_{0}=$$ \frac {a+b+c}{g+h+i}$
$y'_{0}=$$ \frac {d+e+f}{g+h+i}$
$x'_{1}=$$ \frac {a-b+c}{g-h+i}$
$y'_{1}=$$ \frac {d-e+f}{g-h+i}$
$x'_{2}=$$ \frac {-a-b+c}{-g-h+i}$
$y'_{2}=$$ \frac {-d-e+f}{-g-h+i}$
$x'_{3}=$$ \frac {-a+b+c}{-g+h+i}$
$y'_{3}=$$ \frac {-d+e+f}{-g+h+i}$
Ahora queremos invertir la transformación, y encontrar la matriz que produce los puntos anteriores. Dado que tenemos 9 incógnitas y 8 ecuaciones, necesitamos añadir otra ecuación.
$i=1$
Ahora todo lo que queda es resolver las ecuaciones del sistema para encontrar las fórmulas de los valores de la matriz. No soy lo suficientemente paciente ni lo suficientemente bueno en álgebra para hacer esto yo mismo, así que usé una calculadora en línea para resolver el sistema de ecuaciones. Las fórmulas que daba casi funcionaban, pero tenía algunos problemas con las coordenadas y.
Creo que esto se puede reducir a dos preguntas:
-
¿Están mal los cálculos anteriores, o la calculadora en línea tiene un error?
-
¿Hay un algoritmo más fácil para esto?