2010-05-03 8 views
21

Est-ce que quelqu'un connaît des algorithmes standard pour déterminer une matrice de transformation affine basée sur un ensemble de points connus dans deux systèmes de coordonnées?Algorithme de transformation affine

+0

Si je me souviens de mes jours de collège, ne devriez-vous pas être capable de le faire en mettant en place un ensemble d'équations et en résolvant la transformation? Au fait, est-ce votre devoir? – WhirlWind

+0

N'est-ce pas une question pour http://mathoverflow.net? – BalusC

+0

@WhirlWind Non ce n'est pas mon devoir. J'ai moi-même trouvé une solution, mais il semble un peu "hacky" et ne semble pas très bien gérer certains cas. J'ai cherché un algorithme standard, mais il a échoué jusqu'à présent. Je me demandais si quelqu'un en connaissait un. @BalusC Est-ce? Dois-je demander à la place? Désolé :) Je suis un peu nouveau ici. –

Répondre

30

Les transformations affines sont données par des matrices 2x3. Nous effectuons une transformation affine M en prenant notre entrée 2D (xy), en la cognant sur un vecteur 3D (xy 1), puis en multipliant (à gauche) par M.

Donc si nous avons trois points (x1 y1) (x2 y2) (x3 y3) mappage (u1 v1) (u2 v2) (u3 v3) nous avons

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

Vous pouvez obtenir M simplement en multipliant à droite par l'inverse de

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

Une matrice 2x3 multipliée à droite par une matrice 3x3 nous donne le 2x3 que nous voulons. (Vous n'avez pas vraiment besoin de l'inverse complet, mais si l'inverse matriciel est disponible, il est facile à utiliser.)

Facilement adapté aux autres dimensions. Si vous avez plus de 3 points, vous pouvez choisir la méthode des moindres carrés. Vous devrez le demander à nouveau, mais c'est un peu plus difficile.

+0

Qu'en est-il de la traduction? – jeff

+1

La dernière colonne de M donne la traduction. Vous pouvez lire M comme une carte linéaire (donnée par la matrice 2x2 sur la gauche) suivie de la traduction par la dernière colonne. Mais vous n'avez pas à le considérer comme deux transformations séparées. Pour transformer un point 2D, vous devez ajouter un 1 pour en faire un point 3D, puis multiplier par M. Le résultat est un vecteur 2D avec des parties linéaires et de translation appliquées en une fois. – sigfpe

+0

oh, d'accord. Merci ! – jeff