Rechtecke rotieren/drehen

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Klausn
Beiträge: 48
Registriert: 28. Januar 2009 10:40

Rechtecke rotieren/drehen

Beitrag 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 ?
Dateianhänge
rechteck.JPG
rechteck.JPG (2.79 KiB) 4879 mal betrachtet
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
CKassiopaia
Beiträge: 38
Registriert: 21. April 2009 16:42

Beitrag 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();
Klausn
Beiträge: 48
Registriert: 28. Januar 2009 10:40

Beitrag 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;
Antworten