0

Supposons une image I de dimension (2, 2). Coordonnées graphique C sont donnés comme suit:Faire pivoter une image sur son centre sur un GPU

C = [[0, 0], [1, 0], 
    [0, 1], [1, 1]] 

Objectif: I tourner de 90 degrés autour du centre (pas l'origine).

Transformation Matrice:

TRotate (90) = [[0, 1], [-1, 0]]

(supposent que chaque paire de coordonnées peut être transformé en synchronisme (à savoir le un GPU))

Méthode:.

  1. Conv ert coordonnées graphiques aux coordonnées mathématiques avec l'origine comme le centre de l'image.
  2. Appliquez la matrice de transformation.
  3. Conversion en coordonnées graphiques.

Par exemple:

Convertir en coordonnées graphiques:

tx '= tx - largeur/2

ty' = ty - largeur/2

C' =[[-1, -1], [0, -1], 
    [-1, 0], [0, 0]] 

Appliquer la matrice de transformation:

C" = [[-1, 1], [-1, -0], 
     [0, 1], [0, 0]] 

reconvertir:

C" = [[0, 2], [0, 1], 
     [1, 2], [1, 1]] 

la conversion est de retour hors limites ...

Je suis vraiment aux prises pour obtenir une bonne rotation d'un « centre de gravité » de travail. Je pense que ma conversion en «coordonnées mathématiques est fausse».

j'eu plus de chance par plutôt convertir les coordonnées en ce qui suit:

C' =[[-1, -1], [1, -1], 
    [-1, 1], [1, 1]] 

I réalisé cette transformation en observant que, si l'origine existait entre les quatre pixels, avec le + ve axe y pointant vers le bas , et l'axe des x + ve vers la droite, alors le point (0,0) serait (-1, -1) et ainsi de suite pour le reste. (La rotation et la conversion résultantes donnent le résultat souhaité).

Cependant, Je ne trouve pas le bon type de transformation à appliquer aux coordonnées pour placer l'origine au centre. J'ai essayé une matrice de transformation en utilisant des coordonnées homogènes, mais cela ne fonctionne pas.

Modifier

Pour les conseils de Malcolm:

vecteur de position =

[0 
0 
1] 

Traduire en soustrayant la largeur/2 == 1:

[-1 
-1 
0] 

Rotation en multipliant le matrice de transformation:

|-1| | 0 1 0| |-1| 
|-1| X |-1 0 0| = | 1| 
|0 | | 0 0 1| | 0| 

Répondre

1

Vous avez besoin d'une ligne supplémentaire dans votre matrice, pour la translation par x et la translation par y. Vous ajoutez ensuite une colonne supplémentaire à votre vecteur de position, appelez-la w, qui est codée en dur à 1. C'est une astuce pour s'assurer que la traduction peut être effectuée avec une multiplication matricielle standard. Puisque vous avez besoin d'une translation suivie d'une rotation, vous devez configurer la matrice de traduction, puis multiplier par la matrice de rotation (faites les deux 3x3 avec la dernière colonne ignorée si vous êtes tremblant sur la multiplication matricielle) . Ainsi, les traductions et les rotations seront entrelacées les unes avec les autres.

+0

Salut Malcom. Voulez-vous dire une ligne supplémentaire dans le vecteur position donc [x, y, w], avec w = 1? Et voulez-vous dire une colonne et une ligne supplémentaires à la matrice de transformation? – user1658296

+1

Vous pouvez penser à votre point en colonnes ou en lignes, donc si vous le dessinez comme [x y w] il a des colonnes, si vous le dessinez verticalement, il a des lignes. Cela n'a pas d'importance tant que la matrice utilise l'inverse (les lignes correspondent aux colonnes et vice versa). Il peut cependant être plus facile de comprendre si la matrice est carrée. –

+0

Merci, Malcolm, le résultat est difficile à traduire en coordonnées graphiques, cependant. [-1, 1, 0] devrait être le point [0, 1] en coordonnées graphiques. – user1658296