Warum muss ich die operationen mit AffineTransform in umgekehrter Reihenfolge ausfuehren..?

sirbender

Top Contributor
AffineTransform ist column-major (d.h. die tx, ty fuer die translation sind im 3ten column anstatt in der dritten row, welches bei row-major der Fall ist).

Dadurch muss man alle Operationen in umgekehrter Reihenfolge ausfuehren man das rausbekommt was man will.

Da verdreht es einem ja das Hirn :(

Warum hat man sich bei Java's AffineTransform dafuer entschieden das so zu machen? Vielleicht macht es ja andere Sachen wieder leichter die ich jetzt nicht in Betracht ziehe? Oder ist die Performance leicht besser bei column-major?
 

Tarrew

Top Contributor
Also das mit umgekehrter Reihenfolge hat vor allem mathematische Gründe.
Ich kenne das Gebiet nur aus der Computergrafik mit OpenGL etc, vermute aber mal, dass es hier ähnlich laufen wird.

Angenommen du hast 2 Transformationen T_rotation und T_translation und einen Punkt P.
Vermutlich weißt du, dass Transformationen über die Matrixmultiplikation verknüpft werden.

Wendest du jetzt erst die Rotation und dann eine Translation an rechnest du ja:
(T_rotation * T_translation) * P.

Äquivalenter Java Code dazu wäre:
Java:
        AffineTransform trans = new AffineTransform();
        trans.rotate(Math.PI/2);
        trans.translate(1, 1);
        Point p = new Point(1, 1);
        trans.transform(p, p);
        System.out.println(p);

Allerdings ist die Matrixmultiplikation assoziativ. Es gilt also:
(T_rotation * T_translation) * P = T_rotation * (T_translation * P).
Und damit weißt du im Prinzip auch schon, warum du die Transformationen in umgekehrter Reihenfolge anwenden musst.
Weil die Matrixmultiplikation assoziativ ist rechnest du zuerst die Klammer aus, wendest also die Translation auf den Punkt an. Auf den transformierten Punkt wendest du dann die Rotation an.

Bin mit der Java-Klasse nicht vertraut aber ich kann mir auch nicht vorstellen, dass eine row-major Darstellung der Translation daran irgendwas ändern würde, da das mathematisch begründed ist.

Wenn es dir zu kompliziert ist, kannst du die Transformationen auch der Reihe nach anwenden. Es macht keinen Unterschied ob man den obigen Code ausführt oder diesen hier:
Java:
AffineTransform trans2 = new AffineTransform();
        trans2.translate(1, 1);
        Point p2 = new Point(1, 1);
        trans2.transform(p2, p2); //wende zuerst Translation auf Punkt an
        trans2.setToIdentity();
        trans2.rotate(Math.PI/2);
        trans2.transform(p2, p2); //wende danach Rotation auf Punkt an
        System.out.println(p2);

Der obere Code rechnet erst:
T_rotation * T_translation und wendet die resultierende Matrix auf den Punkt an.

Der untere Code wendet erst die Translation auf den Punkt an. Und danach wird die Rotation auf den resultierenden Punkt angewendet. Das Ergebnis ist in beiden Fällen das gleiche.
 
Zuletzt bearbeitet:

DrZoidberg

Top Contributor
AffineTransform ist so definiert, dass gilt: P' = T1 * T2 * ... * P, wobei P ein Spaltenvektor ist.
Man hätte es natürlich auch genausogut andersherum definieren können. Also P' = P * T1 * T2 * ... mit P als Zeilenvektor und T1 - Tn in row-major bzw. P' = ... * T2 * T1 * P mit P als Spaltenvektor und T1 - Tn in column-major, was aufs gleiche rauskäme.
Die Philosophie dahinter ist, dass Koordinatensysteme transformiert werden und nachfolgende Transformationen relativ zum aktuellen transformierten Koordinatensystem sein sollen. Definierst du Transformationen dagegen so rum, wie du es bevorzugst, also row-major, dann sind alle Transformationen immer relativ zum absoluten Koordinatensystem. Oder einfacher ausgedrückt, in einem Fall sind Transformationen relativ und im anderen absolut. Wobei eine Sequenz von relativen Transformationen natürlich mathematisch equivalent ist zur umgekehrten Sequenz von absoluten Transformationen. Das ganze relativ zu definieren ist gerade bei Swing sehr nützlich, da man dann in der paint Methode nicht wissen muss, ob das GUI Element z.B. gedreht oder sonstwie transformiert wurde.
 
Zuletzt bearbeitet:

sirbender

Top Contributor
Java:
AffineTransform trans2 = new AffineTransform();
        trans2.translate(1, 1);
        Point p2 = new Point(1, 1);
        trans2.transform(p2, p2); //wende zuerst Translation auf Punkt an
        trans2.setToIdentity();
        trans2.rotate(Math.PI/2);
        trans2.transform(p2, p2); //wende danach Rotation auf Punkt an
        System.out.println(p2);

Wenn AffineTransform row-major waere koenntest du trans2.setToIdentity(); weglassen. Du wuerdest die Transformationen multiplizieren (und zwar in der Reihenfolge wie man sie anwenden will) und erst zum Schluss auf den Punkt anwenden.
 

sirbender

Top Contributor
AffineTransform ist so definiert, dass gilt: P' = T1 * T2 * ... * P, wobei P ein Spaltenvektor ist.
Man hätte es natürlich auch genausogut andersherum definieren können. Also P' = P * T1 * T2 * ... mit P als Zeilenvektor und T1 - Tn in row-major bzw. P' = ... * T2 * T1 * P mit P als Spaltenvektor und T1 - Tn in column-major, was aufs gleiche rauskäme.
Die Philosophie dahinter ist, dass Koordinatensysteme transformiert werden und nachfolgende Transformationen relativ zum aktuellen transformierten Koordinatensystem sein sollen. Definierst du Transformationen dagegen so rum, wie du es bevorzugst, also row-major, dann sind alle Transformationen immer relativ zum absoluten Koordinatensystem. Oder einfacher ausgedrückt, in einem Fall sind Transformationen relativ und im anderen absolut. Wobei eine Sequenz von relativen Transformationen natürlich mathematisch equivalent ist zur umgekehrten Sequenz von absoluten Transformationen. Das ganze relativ zu definieren ist gerade bei Swing sehr nützlich, da man dann in der paint Methode nicht wissen muss, ob das GUI Element z.B. gedreht oder sonstwie transformiert wurde.

Hmmm...irgendwie leuchtet es mir teilweise ein was du sagst. Irgendwie kann ich mir dein Beispiel mit Swing aber nicht so richtig vorstellen.

Wenn man row-major nutzen wuerde waere Swing viel "aufwaendiger"?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Warum muss ich ein SSL cert immer manuell hinzufügen? Java Basics - Anfänger-Themen 46
_so_far_away_ Inventarisierungssystem brauche switch Cases und weiß nicht, wie ich e implementieren muss Java Basics - Anfänger-Themen 5
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
berserkerdq2 Warum muss man manchmal in der RUnmethode sleep in eine schleife tun? Java Basics - Anfänger-Themen 9
berserkerdq2 wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun? Java Basics - Anfänger-Themen 11
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
D Bitte um Hilfe muss es schnellstmöglich erledigen Java Basics - Anfänger-Themen 15
A OOP Bidirektionale Muss-Assoziation Java Basics - Anfänger-Themen 1
Aqtox Hallo ich muss für die Schule ein Wuerfell Duell erstellen jedoch habe ich ein fehler Java Basics - Anfänger-Themen 4
M Was muss ich verändern damit ich es so ausgegeben bekomme wie auf dem Foto? Java Basics - Anfänger-Themen 2
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
R Was muss ich an meinem Code ändern? Java Basics - Anfänger-Themen 2
L Worauf muss ich achten, wenn ich externe Bibliotheken für meine Anwendungen verwende? Java Basics - Anfänger-Themen 6
L Muss eine HttpURLConnection geschlossen werden? Java Basics - Anfänger-Themen 2
B Email versenden, muss Methode static sein? Java Basics - Anfänger-Themen 7
J Muss ich die externen jars mitgeben? Java Basics - Anfänger-Themen 8
A Wie erkennt die JVM welche class verwendet werden muss? Java Basics - Anfänger-Themen 3
Yjuq Generic Methode - Wie muss die List Definition aussehen? Java Basics - Anfänger-Themen 3
B 4 Strings, Anfangsbuchstaben muss unterschiedlich sein Java Basics - Anfänger-Themen 12
A Doppele Ketten- da muss einer rein! Java Basics - Anfänger-Themen 6
J App.jar muss im Projekt App als Bibliothek vorhanden sein?! Java Basics - Anfänger-Themen 1
S Wie muss ich die Generische Methode schreiben? Java Basics - Anfänger-Themen 6
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
X Muss man das immer so schreiben o.O Java Basics - Anfänger-Themen 3
Z Gleiches Verzeichnis für class und java unter Windows Muss? Java Basics - Anfänger-Themen 11
T Muss ein Parametertest immer eine eigene Testklasse sein? Java Basics - Anfänger-Themen 3
D Socket ---> Server Socket worauf muss ich achten? Java Basics - Anfänger-Themen 2
O Warum muss ich static? Java Basics - Anfänger-Themen 6
B Split, Exception - Obwohl es gehen MUSS Java Basics - Anfänger-Themen 3
B FileWriter close() muss? Java Basics - Anfänger-Themen 8
A Threads Eine Klasse muss auf Variable der Anderen warten. Java Basics - Anfänger-Themen 6
D Sound abspielen, wo muss die .wav liegen Java Basics - Anfänger-Themen 3
X Muss man Java können um Jython nutzen zu können? Java Basics - Anfänger-Themen 14
H Problem: Button muss zwei Mal angeklickt werden, bis Aktion ausgeführt wird Java Basics - Anfänger-Themen 4
S jcal4j/jlog4j Wo muss die Properties file rein? Java Basics - Anfänger-Themen 2
J Warum muss diese Methode static sein ?! Java Basics - Anfänger-Themen 7
D Muss ich eigentlich immer auf die Verwendung des richtigen Datentyps achten? Java Basics - Anfänger-Themen 7
S OOP Wie muss meine Klasse zu dieser main aussehen? Java Basics - Anfänger-Themen 5
D Muss ein Applet schreiben was Mittelwerte berechnet nur was mache ich falsch? Java Basics - Anfänger-Themen 11
T Warum muss diese Variable final deklariert werden? Java Basics - Anfänger-Themen 5
A Was muss ich ändern? Java Basics - Anfänger-Themen 2
E Object als Parameter das Unbekannt ist, aber ein bestimmtes Interface haben muss Java Basics - Anfänger-Themen 3
S Abstrakte Klasse, festlegen, dass Methode verändert werden muss. Java Basics - Anfänger-Themen 4
M Wann muss man eine Variable mit set-/get-Methoden in eine Bean schreiben? Java Basics - Anfänger-Themen 19
T Referenzvariablen - warum muss der Typ definiert werden? Java Basics - Anfänger-Themen 14
E Java-Programm mit Eclipse - wie muss ich anfangen. Java Basics - Anfänger-Themen 7
N Wann muss eine Methode - protected sein wann public wann. Java Basics - Anfänger-Themen 5
H Eine Abstrakte Klasse muss. Java Basics - Anfänger-Themen 7
G vector füllt sich immer weiter. wo muss ich ihn leeren? Java Basics - Anfänger-Themen 3
G Muss es immer extends sein ? Java Basics - Anfänger-Themen 9
F Muss ich TableCellEditor implementieren für checkbox abfrage Java Basics - Anfänger-Themen 3
N Muss ein thread aktive mit stop beendet werden? Java Basics - Anfänger-Themen 18
P 2. Jframe öffnen und 1. Jframe muss sich dann schließen ? Java Basics - Anfänger-Themen 4
S Tabelsorter von SUN, wie muss die MysQL Anbindung realisiert Java Basics - Anfänger-Themen 11
J Rekursiv muss dass laufen! Java Basics - Anfänger-Themen 11
S Muss Programm schreiben -BRAUCHE HILFE Java Basics - Anfänger-Themen 15
C Wie muss man hier aufrufen von 2 eigenen Klassen? Java Basics - Anfänger-Themen 6
F Wie muss ich mit Preferences umgehen. Java Basics - Anfänger-Themen 5
J Ich versteh den Fehler nich, was muss ich denn ändern? Java Basics - Anfänger-Themen 3
C Klasse muss auf Event in einer anderen Klasse reagieren Java Basics - Anfänger-Themen 7
G Class.forName: Wie muss die Klasse angegeben werden? Java Basics - Anfänger-Themen 3
M muß durch muss ersetzen Java Basics - Anfänger-Themen 7
G Wie muss classpath lauten? Package kompilieren/interpretiere Java Basics - Anfänger-Themen 4
ven000m try catch - was muss bei catch rein Java Basics - Anfänger-Themen 28
D Wert muss sich pro sek ändern aber wie? HELP! Java Basics - Anfänger-Themen 9
P wohin muss ich die packages kopieren? Java Basics - Anfänger-Themen 12
G wieso muss Textfield final sein? Java Basics - Anfänger-Themen 6
Linad Warum muss man Variablen einen Wert zuweisen? Java Basics - Anfänger-Themen 5
G Warum muss das Textfeld final sein? Java Basics - Anfänger-Themen 2
G JDOM: muss XML-Datei nach Änderung abgespeichert werden? Java Basics - Anfänger-Themen 2
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
J Listen Operationen Java Basics - Anfänger-Themen 4
D Algorithmus in Pseudocode mit log2(n) Operationen erstellen Java Basics - Anfänger-Themen 3
Hacer Operationen einfach verketteter Listen Java Basics - Anfänger-Themen 22
B Matrizen Operationen Java Basics - Anfänger-Themen 7
S NaN - Operationen ohne Fehler? Java Basics - Anfänger-Themen 3
B AffineTransform - Reihenfolge der Operationen Java Basics - Anfänger-Themen 3
G Messen von Elementaren Operationen Java Basics - Anfänger-Themen 3
S Liste von möglichen Operationen Java Basics - Anfänger-Themen 2
B genaue Anzahl der Operationen in Schleifen Java Basics - Anfänger-Themen 5
C Operationen auf Bitebene und Verschiebeoperatoren wichtig? Java Basics - Anfänger-Themen 26
Haave Postfix-Rechner: mehrere math. Operationen nacheinander ausführen Java Basics - Anfänger-Themen 8
M Bit/Byte Operationen Java Java Basics - Anfänger-Themen 8
B math. Operationen + Ausgabe Fehler :S Java Basics - Anfänger-Themen 5
K println - Klammern von Operationen Java Basics - Anfänger-Themen 4
O Operationen auf ein Set Java Basics - Anfänger-Themen 3
Q mathematische Operationen als Methode und nicht Infix-Operator Java Basics - Anfänger-Themen 14
X Zählen von arithmetischen Operationen und Vergleichsoperationen Java Basics - Anfänger-Themen 7
R Kommandozeile Operationen Java Basics - Anfänger-Themen 3
G Strings Operationen Java Basics - Anfänger-Themen 7
G String-Operationen Java Basics - Anfänger-Themen 6
F Operationen mit Zeichenketten Java Basics - Anfänger-Themen 8
ven000m Aritmethische Operationen Java Basics - Anfänger-Themen 7
S Stack-Operationen Java Basics - Anfänger-Themen 59
TheSorm AffineTransform drehung Java Basics - Anfänger-Themen 6
R AffineTransform problem. Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben