2011-04-06 2 views
1

J'essaie de dessiner une image et elle sera tournée dans différents angles . Après rotation, l'image doit être positionnée dans une fenêtre d'affichage en fonction de la taille(). J'ai essayé ceci using translate(), mais je n'a pas pu calculer les coordonnées dynamiques selon l'angle dans lequel l'image a été dessinée. Mon code ressemble à ceciComment positionner une image dans une fenêtre d'affichage

void setup() 
{ 
    size(600, 600); 
    translate(width/2, height/2); 
    drawTriangles(); 
} 

void drawTriangles() 
{ 
    float deg = 180; 
    float rad = radians(deg); 
    rotate(rad); 
    shapes(5, 15, 75, 55); 
} 

void shapes(int edges, float cx, float cy, float r) 
{ 
    float angle = 360.0/edges; 
    beginShape(); 
    for (int i = 0; i < edges; i++) 
    { 
    vertex(cx + r * cos(radians(angle * i)), cy + r * 
sin(radians(angle * i))); 
    } 
    endShape(CLOSE); 
} 

Comment rendre l'image visible dans une fenêtre d'affichage?

Répondre

1

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.

Questions connexes