Voila mon probleme : je cherche un programme en c++ pour pouvoir faire pivoter une image de 90 ou 180°. Je pense avoir compris le concept il suffit de prendre la premiere ligne de code et la remplacer avec la derniere et ainsi de suite pour pivoter de 180° par exemple... Mais rien de bien concret.. si vous avez une piste n'hésitez pas !! Je travaille sous Dev C++
pour faire une rotation, qu'elle soit de 90°, 180° ou autre (30° par exemple), il faut toujours boucler sur les pixels de l'image finale car dans le cas où l'on a pas 90°, on saute des pixels.
Ensuite, il ne faut pas réfléchir à savoir quel sens en fonction de l'angle. Il suffit d'appliquer un modèle mathématique.
Si tu connais les matrices de rotation, il faut les utiliserles matrices:
(x', y',1) = ((cos θ, -sin θ, 0)(sin θ, cos θ, 0)(0,0,1)) (x, y,1)
Bon ça va faire une rotation d'axe (0,0), donc si tu veux faire une rotation autour de (x0, y0), il faut faire une translation par la matrice de translation:
((1,0,0)(0,1,0)(x0,y0,1)).
Pour faire la rotation autour de (x0, y0), on déplace tout du point central vers l'origine (0,0), puis on fait la rotation autour de (0,0), et on refait la translation opposée pour tout remettre au bon endroit.
On a donc la matrice R(x0, y0) = T(-x0, -y0) * R(0,0) * T(x0, y0)
soit R(x0, y0) = ((1,0,0)(0,1,0)(-x0,-y0,1)) * ((cos θ, -sin θ, 0)(sin θ, cos θ, 0)(0,0,1)) * ((1,0,0)(0,1,0)(-x0,-y0,1))
on calcule le produit et on multiplie la matrice par le vecteur [x;y;1], pour obtenir le resultat:
x' = cosθ * x - sinθ * y + (cosθ - 1) * x0 - sinθ * y0
y' = sinθ * x + cosθ * y + sinθ * x0 + (cosθ - 1) * y0
Bon j'ai fait les calculs à l'envers lol
puisque j'ai dit qu'il fallait partir du pixel final, pour trouver à quel pixel ça correspond sur l'image d'origine, donc il faut prendre, -θ au lieu de θ:
voilà, j'espère ne pas me tromper. x' et y' son les positions du pixel courant dans l'image après rotation, et x et y sont les position du même pixel dans l'image d'origine.
si on prend θ = 90°, on a cosθ = 0 et sinθ = 1:
x = y' - x0 - y0
y = - x' - x0 - y0
Bon je me suis peut-être trompé dans les signes mais en gros c'est ça.
EDIT:certainement même, faudrait peut-être prendre -x0 au lieu de x0 et -y0 au lieu de y0.
Voilà tu peux faire une rotation de n'importe quel angle.
Après quand tu fais ta rotation, tu ne va pas forcément tomber sur un pixel (x ,y) exact sur l'image d'origine. Ici plusieurs possibilités:
- soit tu arrondis simplement pour prendre le pixel à gauche
- soit tu trouves le pixel le plus proche pour être proche de la réalité
- soit tu fait une interpolation selon la distance des 4 pixels qui l'entourent en calculant la couleur pondérée par la distance.
Voilà, ben en fait, pour la 3D, c'est exactement le même principe, sauf que la matrice (qui sont de 4x4 au lieu de 3x3) de rotation se fait sur un axe, et qu'il faut combiner les rotation par les mêmes multiplications.
Sous Windows, ça se fait tout seul avec l'api Win32 (cf http://tinyurl.com/cvd7wv) ( jamais de libs externes sous Win32, puisque l'api fait tout en 3 lignes de code à chaque fois)