2010-12-14 11 views
1

Es wird gesagt, dass, um eine Linie um einen bestimmten Winkel zu drehen, multiplizieren Sie ihre Endpunkt Koordinaten durch die Matrix ({Cos (a), Sin (a)} {-Sin (a) Cos (a)}), wobei ein Rotationswinkel ist. Die resultierenden zwei Zahlen in der Matrix sind x und y Koordinaten des Endpunktes der gedrehten Linie. Die Rotation verläuft um den Startpunkt der Linie. Vereinfachend, neue Koordinaten werden {x * Cos (a) - y * Sin (a)} für x und {x * Sin (a) + y * Cos (a)} für y.Problem rotierende einfache Linie Bild

Aufgabe ist es, ein Dreieck zu drehen, mit dieser Methode. Aber der folgende Code, der diese Methode verwendet, einigen Mist heraus geben wird statt gedrehte Bild (twisted Form von Original-Dreieck, gedreht durch „random“ Winkel):

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; 

Nun, ich bin aus Ideen. Was mache ich falsch?

Danke für Ihre Zeit.

Antwort

4

Die von Ihnen verwendete Formel dreht einen Punkt um (0, 0). Um das gewünschte Ergebnis zu erreichen, ändern Sie Ihre Berechnung wie folgt:

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

Vielen Dank. Problem war wirklich die Relativität von x und y =) – Arnthor

4

Sie scheinen jede einzelne Linie um ihre anfänglichen Startpunktkoordinaten zu drehen. So wird Zeile 1 um ihren Startpunkt rotiert (x0, y0); dann wird Linie 2 um bx rotiert, um; dann wird Zeile 3 um cx gedreht. Dies führt zu einem verdrehten Dreieck. Stattdessen müssen Sie alle drei Linien um den Startpunkt der ersten Linie drehen.