2010-05-03 18 views
21

¿Alguien sabe de algún algoritmo estándar para determinar una matriz de transformación afín basada en un conjunto de puntos conocidos en dos sistemas de coordenadas?Algoritmo de transformación afín

+0

Si recuerdo mis días en la universidad, ¿no debería ser capaz de hacer esto al configurar un conjunto de ecuaciones y resolver la transformación? Por cierto, ¿es esta tu tarea? – WhirlWind

+0

¿No es esta una pregunta más para http://mathoverflow.net? – BalusC

+0

@WhirlWind No, esta no es mi tarea. He encontrado una solución yo mismo, sin embargo, parece un poco "hacky" y no parece manejar algunos casos muy bien. He estado buscando un algoritmo estándar, pero hasta ahora no ha tenido éxito. Me preguntaba si alguien aquí sabe de uno. @BalusC ¿Lo es? ¿Debería preguntar allí en su lugar? Lo siento :) Soy un poco nuevo aquí. –

Respuesta

30

Las transformaciones de Affine están dadas por matrices de 2x3. Realizamos una transformación afín M tomando nuestra entrada 2D (xy), llevándola a un vector 3D (xy 1), y luego multiplicando (a la izquierda) por M.

Así que si tenemos tres puntos (x1) y1) (x2 y2) (x3 y3) mapeo de (U1 V1) (u2 v2) (U3 v3) entonces tenemos

[x1 x2 x3] [u1 u2 u3] 
M [y1 y2 y3] = [v1 v2 v3]. 
    [ 1 1 1] 

, usted puede obtener M simplemente multiplicando a la derecha por la inversa de

[x1 x2 x3] 
[y1 y2 y3] 
[ 1 1 1]. 

Una matriz de 2x3 multiplicada a la derecha por una matriz de 3x3 nos da los 2x3 que queremos. (En realidad, no es necesario el inverso completo, pero si la matriz inversa está disponible, es fácil de usar.)

Se adapta fácilmente a otras dimensiones. Si tiene más de 3 puntos, es posible que desee un ajuste de mínimos cuadrados. Tendrás que volver a preguntar por eso, pero es un poco más difícil.

+0

¿Qué tal la traducción? – jeff

+1

La última columna de M da la traducción. Puede leer M como un mapa lineal (dado por la matriz de 2x2 a la izquierda) seguido de la traducción por la última columna. Pero no tienes que pensar en eso como dos transformaciones separadas. Para transformar un punto 2D, añada un 1 para convertirlo en un punto 3D y luego multiplique por M. El resultado es un vector 2D con partes lineales y de traducción aplicadas de una vez. – sigfpe

+0

oh, está bien. Gracias ! – jeff

Cuestiones relacionadas