Avant de faire pivoter votre image, déterminez les points d'angle de l'image. Appelons-les {C1, C2, C3, C4}, et stocker les coordonnées dans un int [8]:
PImage myimage = ...;
int w = myimage.width;
int h = myimage.height;
int[] coordinates = {0,0, w,0, 0,h, w,h};
Après avoir fait tourner l'image, ces points maintenant ressembler à:
C1.x' = C1.x * cos(angle) - C1.y * sin(angle);
C1.y' = C1.x * sin(angle) + C1.y * cos(angle);
...
donc, dans le code, cela ressemble:
// buffer the "current" translate/rotate/scale values
pushMatrix();
// rotate the view
rotate(angle);
// determine the coordinates for the corners of the rotated image
int[] rotated_coordinates = new int[8];
for(int c=0; c<8; c+=2) {
rotated_coordinates[c] = coordinates[c]*cos(angle) -
coordinates[c+1]*sin(angle);
rotated_coordinates[c+1] = coordinates[c]*sin(angle) +
coordinates[c+1]*cos(angle); }
maintenant, afin d'adapter l'image à la fenêtre dictée par la taille(), vous souhaitez repositionner et redimensionner l'image afin que les quatre points d'angle touchent les bords de la fenêtre; nous pouvons le faire comme suit:
// determine the bounding extremities for the rotated image
// (replace C1.x' etc. with the rotated_coordinates[] entry)
int minx = min(min(C1.x',C2.x'),min(C3.x',C4.x'));
int miny = min(min(C1.y',C2.y'),min(C3.y',C4.y'));
int maxx = max(max(C1.x',C2.x'),max(C3.x',C4.x'));
int maxy = max(max(C1.y',C2.y'),max(C3.y',C4.y'));
// translate so that the minx/y are on the x=0/y=0 lines
translate(-minx, -miny);
// scale so that the maxx/y are on the x=width/y=height lines
scaleX(width/(maxx-minx));
scaleY(height/maxy-miny));
// draw image
image(myimage,0,0,width,height);
// restore the previous translate/rotate/scale values
popMatrix();
Donc, vous faites une rotation à la fois de la vue à l'aide rotate(), et vous suivre manuellement le résultat de cette rotation en termes de la façon dont cela modifie l'angle d'image coordonnées afin que vous pouvez obtenir le bon placement.