2012-05-22 14 views
15

Quiero hacer un dibujo en 2D y, por lo tanto, quiero implementar algunas transformaciones de matriz. Con mis conocimientos de matemáticas claras, intento comprender cómo hacerlo en C# (cualquier otro lenguaje de oops lo haría obviamente).¿Por qué las transformaciones 2D necesitan matrices 3x3?

Todo lo que leí es que debemos trabajar con matrices 3x3 para poder hacer frente a las traducciones. Porque no puedes hacer traducciones con multiplicaciones. Pero esto es con las multiplicaciones de las matrices que creamos nuestras transformaciones. Así que trabajamos con algo como:

{ x1, x2, tx } 
{ y1, y2, ty } 
{ 0, 0, 1 } 

Entiendo el significado de la tercera columna, pero ¿por qué necesitamos la tercera fila? En una matriz de identidad, así como en una rotación, escala o rotación, la última fila es la misma. ¿Hay operaciones que no alcancé pero que las necesitarán? ¿Es porque algunos lenguajes (Java) funcionan mejor con matrices de "dimensiones cuadradas"? Si es así, puedo usar 3 columnas y 2 filas en C# (ya que las matrices dentadas funcionan igual o mejor).

Por ejemplo, para una traducción de rotación + I tienen una matriz como ésta

{ cos(rot)*x1, (-sin(rot))*x2, tx } 
{ sin(rot)*y1, cos(rot)*y2, ty } 
{ 0,   0,    1 } 

No hay necesidad de la última fila.

+1

Comience su lectura en http://en.wikipedia.org/wiki/Translation_(geometry), luego siga uno de los enlaces a http://en.wikipedia.org/wiki/Homogeneous_coordinates –

+1

@HighPerformanceMark Estoy aquí tratando de explicar qué punto de estos conceptos no entiendo. Sí, estos son los 2 primeros documentos con los que comencé a leer. –

Respuesta

26

esto es con multiplicaciones de las matrices que creamos nuestras transformaciones

Este es por eso que queremos matrices cuadradas.

Supongamos que hacemos lo que propone, y utilizamos matrices 2x3 para nuestras transformaciones.

Entonces una rotación habría

(x1, x2, 0) 
(y1, y2, 0) 

y una traducción habría

(1, 0, tx) 
(0, 1, ty) 

y que podría llevar a cabo cualquiera de rotaciones o traducciones multiplicando nuestra matriz por un vector de columna que representa el punto:

(x) 
M (y) 
    (0) 

para obtener respuestas correctas.

Sin embargo, - ¿cómo podríamos ir sobre componiendo transformaciones? De hecho, para su ejemplo "para una rotación + traducción tengo una matriz como esta", ¿cómo llegó a esa matriz? Claro, en este caso, puedes escribirlo, ¿pero en general?Bueno, ya sabes la respuesta:

esto es con multiplicaciones de las matrices que creamos nuestras transformaciones

por lo que debe ser posible multiplicar dos matrices de transformación para dar otra matriz de transformación. Y las reglas de la multiplicación de matrices muestran que esto:

(. . .) (. . .) 
(. . .) (. . .) = ??? 

no es una matriz de multiplicación válida. Necesitamos matrices que puedan multiplicarse para que nuestras transformaciones sean compostables. Entonces tenemos esa fila extra.


Ahora, la forma en que he expresado aquí es, de hecho, completamente hacia atrás desde la presentación matemática estándar, en el que las transformaciones familiares de rotación y traslación son sólo casos especiales de todo el poder de las transformaciones de coordenadas homogéneas en el plano proyectivo, pero creo que servirá para mostrarle por qué necesitamos esa fila adicional, para hacer que la matriz sea cuadrada, y así poder multiplicarla con matrices similares.

+0

Uuh ¡ese es el punto que aún no veía! Gracias, AakashM. Gracias por haberme tomado el tiempo de descubrir el agujero en mi pensamiento. –

+0

+1 gran respuesta. – Doug

+0

Y el cálculo real para una traducción de '(tx, ty)' se ve como '[x y 1] x [1 0 0; 0 1 0; tx ty 1] = [x + tx y + ty 1] '. – Gerard

5

La respuesta es Coordenadas homogéneas. Para combinar la rotación y la traducción en una operación, se necesita una dimensión adicional a la requerida por el modelo. Para cosas planas esto es 3 componentes y para cosas espaciales esto es 4 componentes. Los operadores toman 3 componentes y devuelven 3 componentes que requieren matrices de 3x3.

+0

¿Pero cuál es el propósito de la fila {0,0,1} en 2D? Podemos calcular traducciones y transformaciones lineales sin ella. (Si entendí correctamente) –

+0

Como dije, la tercera fila es necesaria para producir un resultado de 3 componentes. Es posible que el tercer componente no siempre sea igual a '1' y que la tercera fila no sea' [0 0 1] 'en otras transformaciones afines. – ja72

+0

No pensé en el hecho de que necesitamos esto para operaciones matriciales; esa es una "restricción matemática" que no había previsto. (Perdón por ser lento) –

Cuestiones relacionadas