[gelöst] QRect um linke, obere Ecke drehen

Alles rund um die Programmierung mit Qt
Antworten
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

[gelöst] QRect um linke, obere Ecke drehen

Beitrag von René »

Hallo,

ich versuche gerade ein Rechteck, das mittels zweier QPoints in einer QRect Struktur beschrieben ist, um den linken oberen Eckpunkt zu drehen mit Hilfe von painter.rotate(angle) innerhalb eines QPaintEvents. Prinzipiell funktionert das auch, nur dreht er eben nicht nur ausschließlich um den linken oberen Eckpunkt, sondern dieser wird auch noch entlang irgendeiner Kreisbahn im Bild verschoben. Vor dem Aufruf der rotate Funktion verschiebe ich mittels world Matrix durch painter.translate(-1 * rechteck.x(), -1 * rechteck.y()) das Rechteck so, dass die linke obere Ecke des Rechtecks auf den Ursprung des viewports gelegt wird, also auf die Koordinaten (0,0). Anschließend verrechne ich die Rotationsmatrix mittels painter.rotate(angle) und danach mache ich die Translation wieder rückgängig mittels painter.translate(rechteck.topLeft()).

Also das Ganze nochmal zusammengefasst:

Code: Alles auswählen

void testklasse::paintEvent(QPaintEvent * /* event */ )
{
  QPainter painter(this);
  painter.drawPixmap(0,0,pixmap);
  painter.setPen(palette().light().color());
  // 'rechteck' ist vom Typ QRect
  painter.translate(-1 * rechteck.x(), -1 * rechteck.y());
  painter.rotate(angle);
  painter.translate(rechteck.topLeft());
  painter.drawRect(rechteck.normalize().adjusted(0,0,-1,-1));
}
Erstaunlicherweise kann ich auch die Translation zum Ursprung und wieder zurück weglassen und einfach nur rotate ausführen, welches dann zum selben Ergebniss führt. Da stimmt doch was nicht. Was mache ich falsch ?

Gruß
René
Zuletzt geändert von René am 18. September 2006 22:45, insgesamt 1-mal geändert.
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

Beitrag von René »

Wenn ich das Rechteck übrigens direkt auf (0,0) mit der oberen linken Ecke lege, dann lässt es sich korrekt um diesen Punkt drehen, je weiter ich allerdings das Rechteck vom Ursprung weg platziere, desto größer wird die Verschiebung des Rechtecks beim drehen ... schön schön, ist ja eigentlich klar, genau dafür mache ich doch die Translation und platziere damit die linke obere Ecke auf (0,0), rotiere erst dann, und verschiebe wieder zurück. Jedoch scheint genau das nicht zu funktionieren. Woran kann das liegen ?
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

Beitrag von René »

Die Lösung ist ganz einfach, bzw. sogar schon so peinlich, dass ich es besser nicht sagen sollte :wink:

Man kann nicht das Rechteck zum Urspung des Koordinatensystems verschieben. Mit QPainter::translate() verschiebt man das Koordinatensystem so, dass der Punkt (0,0) auf dem zu drehenden Rechteck liegt, in meinem Beispiel linke obere Ecke. Also einmal die Vorzeichen bei meinen translate-Anweisungen umkehren und schon klappt es.
Antworten