Seite 1 von 1

Rechtecke rotieren/drehen

Verfasst: 2. April 2009 15:45
von Klausn
Hi zusammen,

ich will ein Rechteck drehen was aus 4 Punkten besteht ! Funktioniert soweit auch ganz gut aber : ich dreh das um Punkt 0 ...

Ich will das aber um den Mittelpunkt drehen !!! Wie geht das ???

die normale drehung um punkt 0 sieht so aus:

float x0 = 0;
float y0 = 0;
float x1 = ((breite) * cos(a) - (0) * sin(a)) ;
float y1 = ((breite) * sin(a) + (0) * cos(a)) ;
float x2 = ((breite) * cos(a) - (laenge/2) * sin(a));
float y2 = ((breite) * sin(a) + (laenge/2) * cos(a));
float x3 = ((0) * cos(a) - (laenge/2) * sin(a));
float y3 = ((0) * sin(a) + (laenge/2) * cos(a));

funktioniert super ! Aber eben nur um Punkt 0.
Kann mir da jemand weiterhelfen ?

Verfasst: 2. April 2009 20:40
von upsala
Nachdem wir hier im Qt-Forum sind empfehle ich folgende Funktion:

Code: Alles auswählen

QPolygon QTransform::mapToPolygon ( const QRect & rectangle ) const
Ansonsten Mittelpunkt berechnen, von deinen Punkten abziehen und nach der Berechnung wieder dazuaddieren.

Verfasst: 11. Mai 2009 14:13
von CKassiopaia
Andere Möglichkeit:
Koordinatensystem so verschieben, dass (0/0) im Mittelpunkt des Rechecks liegt... und dann rotate(winkel)

Diese Möglichkeit finde ich gut, wenn man nicht "nur" ein rechteck sondern kompliziertere Zeichnungen drehen will...

Wie wichtig ein save() und Restore am Anfang und Ende der Rotation ist weiß ich nicht...ich habe es drin da dadurch Rundungsfehler bei mehrmaliger Rotation verhindert werden sollen....

Also bei mir siehts so aus...

Code: Alles auswählen


setWindow(..);
save();
rotate(winkel);
"Alles Zeichnen"
..
restore();

Verfasst: 12. Mai 2009 15:22
von Klausn
habs mittlerweile hinbekommen... ich habe die Formel zur Berechnung ein wenig verändert und nun funktioniert es wunderbar..


float x0 = ((0 - breite/2 ) * cos(a) - (0 - breite/2) * sin(a))+breite/2;
float y0 = ((0 - laenge/2) * sin(a) + (0 - laenge/2) * cos(a))+laenge/2;
float x1 = ((breite- breite/2) * cos(a) - (0- breite/2) * sin(a))+breite/2;
float y1 = ((breite- laenge/2) * sin(a) + (0 - laenge/2) * cos(a))+laenge/2;
float x2 = ((breite- breite/2) * cos(a) - (laenge/2 - breite/2) * sin(a))+breite/2;
float y2 = ((breite- laenge/2) * sin(a) + (laenge/2 - laenge/2) * cos(a))+laenge/2;
float x3 = ((0 - breite/2) * cos(a) - (laenge/2 - breite/2) * sin(a))+breite/2;
float y3 = ((0- laenge/2) * sin(a) + (laenge/2 - laenge/2) * cos(a))+laenge/2;