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 ?
Rechtecke rotieren/drehen
Rechtecke rotieren/drehen
- Dateianhänge
-
- rechteck.JPG (2.79 KiB) 4879 mal betrachtet
Nachdem wir hier im Qt-Forum sind empfehle ich folgende Funktion:
Ansonsten Mittelpunkt berechnen, von deinen Punkten abziehen und nach der Berechnung wieder dazuaddieren.
Code: Alles auswählen
QPolygon QTransform::mapToPolygon ( const QRect & rectangle ) const-
CKassiopaia
- Beiträge: 38
- Registriert: 21. April 2009 16:42
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...
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();
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;
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;