Koordinaten transformieren (Rotation)

at0m

Mitglied
Hallo zusammen!

Ich arbeite derzeit mit dem Graphiti Framework und erstelle damit einen grafischen Editor für eine bestimmte Modellierungsart. Dieses Framework verwendet Grundformen abseits von java.awt. Aber auch dort erhalten die Grundformen die folgenden Parameter: x, y, Breite, Höhe. Die Grundformen sind Rechtecke, Polygone, Ellipsen und Linien.

Diese Formen befinden sich irgenwo im Koordinatensystem und ich muss sie nun um einen vorgegebenen Winkel drehen. Ich habe mir schon AffineTransformation angesehen aber dieses arbeitet mit awt.

Welche einfache Möglichkeit gibt es, um die Formen um ihren Mittelpunkt zu drehen? Hat da einer einen Tipp für mich?
 
Moin,

ene Tipp habe ich leider nicht, bezweifele aber stark, dass es sich hier um ein Anfänger-Thema handelt :shock:

Gruß
Klaus
 
Hallo at0m,

wie VfL_Freak bereits erwähnte, ist das hier bei Gott kein Anfänger-Thema 😉

Nichtsdestotrotz:

Dass AffineTransformation AWT benutzt, ist egal. Du brauchst lediglich ein Graphics2D-Objekt des zu transformierenden Objektes.

Beispiel:

Java:
public void rotate(Graphics g)
{
    Graphics2D g2d = (Graphics2D) g;
    double rotRad = Math.PI;
    
    AffineTransform at = g2d.getTransform();
    at.rotate(rotRad);
  
    g2d.transform(at);    
}

Sollte deine Grafik um 180° drehen. Ich kenne Graphiti nicht, falls du keinen Zugriff auf ein Graphics-Objekt hast, kannst du dir sowas selber basteln (Kurzfassung):

Beim Drehen einer Figur wird jeder Vektor einzeln transformiert. Das erfolgt über die Formel:

Code:
x[2] = x[1] * cos(alpha) - y[1] * sin(alpha)
y[2] = y[1] * cos(alpha) + x[1] * sin(alpha)

Gehen wir von den Werten x[1] = 2 und y[1] = 0 aus, wären die transformierten Koordinaten bei einer Drehung von pi/2 rad (90°) x[2] = 0 und y[2] = 2.

Nachzulesen hier:

Geometrische Transformationen
 
Ohne das Framework oder andere nähere Details zu kennen will ich dennoch ein bisschen was grundsätzliches sagen...

Zum einen solltest du klären, was genau du hier mit Mittelpunkt meinst. Speziell bei Polygonen hast du durchaus verschiedene sinnvolle Möglichkeiten diesen zu definieren. Dir mag hier vielleicht klar sein, was gemeint ist, aber potentielle Helfer können nur raten.

Ferner ist es oft einfacher eine Drehung zu Beschreiben, wenn das Rotationszentrum im (Koordinaten)ursprung liegt. Das ist aber meist einfach zu erreichen, indem du vor und nach der Rotation einfach eine entsprechende Translation durchführst.
 
Du kannst unabhängig von allem einfach Rotationsmatrizen nutzen.
Die Matrizen für die Drehungen sehen so aus.
Rotation matrix - Wikipedia, the free encyclopedia

Winkel um den gedreht werden soll in Sinus/Cosinus einsetzen, Matrix mit Vektoren (Punkten) mal nehmen, fertig. Für 2D gibt es nur eine 2x2 Matrix. Das ist jedenfalls so wenn du das komplette Bild drehen willst.

Willst du nur ein Objekt im Bild drehen, so muss der Punkt um den gedreht werden soll im Ursprung liegen, also Punkt (0|0). Die anderen Koordinaten müsste man mit verschieben - die liegen dann um (0|0) herum. Hier muss man sich ein Koordinatensystem vorstellen, der Java Zeichenbereich wäre dann im 4 Quadranten (rechts unten). Punkt 0|0 des Zeichenbereichs liegt somit dann im Ursprung des Koordinantensystems. Matrix dann auf alle verschobenen Punkte anwenden und die Verschiebung hinterher für jeden Punkt wieder rückgängig machen. Wichtig ist die Reihenfolge Matrix * Vektor, anders rum geht es nicht bzw. ist nicht definiert. Resultat sind "gedrehte Koordinaten" für das Zeichenobjekt. So funktioniert das mit GPUs auch in OpenGL / DirectX etc.

Also: Sagen wir der Mittelpunkt eines Dreiecks ist bei (3|3), den sucht man sich einfach aus bzw errechnet ihn aus den Eckpunkten. Der Müsste um -3 auf X und Y Achse verschoben werden. Die gleiche Verschiebung wendet man dann bei allen Eckpunkten des Dreiecks an, macht das Matrix Zeug und scheibt dann alles um +3|3 zurück. Mehr ist das nicht.

Schiebt man es nicht in den Ursprung, dann hat man einen "Dreharm" vom Usprung bis zum Drehpunkt. Wendet man darauf die Matrix an, dann dreht sich der "Dreharm" um den Ursprung und nimmt die Punkte mit. Das kann man sich so vorstellen wie wenn man das Ende eines Stiftes in einen Punkt legt und den Stift um den Punkt dreht. Das Zeichenobjekt am anderen Ende wandert dann im Kreis mit.

Wer Lust hat kann sich ja mal eine eigene Rotationsklasse machen 🙂
Matrizen und Vektoren stellt man einfach mit Arrays dar und multipliziert diese entsprechend der Matrizen Regeln. Dann muss man nur noch die Punkte übergeben, sowie den Drehpunkt und den Winkel - fertig ist die Rotations Methode 🙂

Hinweis: Der Kram ist relevant für ein Informatik Studium 🙂
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben