2010-12-14 7 views
1

Il est indiqué que pour faire pivoter une ligne d'un certain angle, vous multipliez ses coordonnées de point final par la matrice ({Cos (a), Sin (a)} {-Sin (a) Cos (a)}), où un est l'angle de rotation. Les deux nombres résultants dans la matrice seront x et y coordonnées du point final de la ligne pivotée. La rotation tourne autour du point de départ de la ligne. En simplifiant, les nouvelles coordonnées seront {x * Cos (a) - y * Sin (a)} pour x et {x * Sin (a) + y * Cos (a)} pour y.Problème rotation simple image de ligne

La tâche consiste à faire pivoter un triangle en utilisant cette méthode. Mais le code suivant qui utilise cette méthode, est de donner une merde au lieu de l'image réorientée (forme tordue de triangle original, tourné par un angle « aléatoire »):

x0:=200; 
y0:=200; 

    bx:=StrToInt(Edit1.Text); 
    by:=StrToInt(Edit2.Text); 
    cx:=StrToInt(Edit4.Text); 
    cy:=StrToInt(Edit5.Text); 
    a:=StrToInt(Edit3.Text); 

    //Original triangle 

    Form1.Canvas.Pen.Color:=clBlue; 
    Form1.Canvas.MoveTo(x0,y0); 
    Form1.Canvas.LineTo(bx,by); 
    Form1.Canvas.LineTo(cx,cy); 
    Form1.Canvas.LineTo(x0,y0); 

    //New triangle 
    Form1.Canvas.Pen.Color:=clGreen;  
    Form1.Canvas.MoveTo(x0,y0); 
    b1x:=Round(bx*cos(a*pi/180)-by*sin(a*pi/180)); 
    b1y:=Round(bx*sin(a*pi/180)+by*cos(a*pi/180)); 
    c1x:=Round(cx*cos(a*pi/180)-cy*sin(a*pi/180)); 
    c1y:=Round(cx*sin(a*pi/180)+cy*cos(a*pi/180)); 
    Form1.Canvas.LineTo(b1x,b1y); 
    Form1.Canvas.MoveTo(x0,y0); 
    Form1.Canvas.LineTo(c1x,c1y); 
    Form1.Canvas.LineTo(b1x,b1y); 

end; 

Eh bien, je suis d'idées. Qu'est-ce que je fais mal?

Merci pour votre temps.

Répondre

4

La formule que vous utilisez tourne autour d'un point (0, 0). Pour obtenir le résultat souhaité, changez votre calcul sur:

b1x:=x0 + Round((bx-x0)*cos(a*pi/180)-(by-y0)*sin(a*pi/180)); 
b1y:=y0 + Round((bx-x0)*sin(a*pi/180)+(by-y0)*cos(a*pi/180)); 
c1x:=x0 + Round((cx-x0)*cos(a*pi/180)-(cy-y0)*sin(a*pi/180)); 
c1y:=y0 + Round((cx-x0)*sin(a*pi/180)+(cy-y0)*cos(a*pi/180)); 
+0

Merci. Le problème était vraiment sur la relativité de x et y =) – Arnthor

4

Vous semblez faire pivoter chaque ligne individuelle autour de ses coordonnées initiales. Donc, la ligne 1 va tourner autour de son point de départ (x0, y0); alors la ligne 2 va tourner autour de bx, par; alors la ligne 3 sera tournée autour de cx. Cela se traduira par un triangle torsadé. Au lieu de cela, vous devrez faire pivoter les trois lignes autour du point de départ de la première ligne.