AffineTransform - Reihenfolge der Operationen

Bazinga

Mitglied
Hallo,
ich bin kürzlich auf die Klasse AffineTransform und hab damit etwas rumexperimentiert. Dabei ist mir folgende Merkwürdigkeit aufgefallen:
Java:
AffineTransform at1 = new AffineTransform();
at1.scale(2, 2);
at1.translate(5, 5);
Ich hätte erwartet, dass mit at1 jetzt Punkte erst skaliert und dann verschoben werden. Tatsächlich ist es aber genau umgekehrt (d.h. es wird erst verschoben, dann skaliert, was natürlich zu unterschiedlichen Ergebnissen führt). Das bestätigt auch die API-Doc. Um die von mir beabsichtigte Reihenfolge zu erhalten, muss ich folgendes machen:
Java:
AffineTransform at2 = new AffineTransform();
at2.preConcatenate(AffineTransform.getScaleInstance(2, 2));
at2.preConcatenate(AffineTransform.getTranslateInstance(5, 5));

Meine Frage dazu: gibts einen Grund, die Reihenfolge quasi rückwärts aufzubauen oder verstehe ich nur irgendwas nicht richtig. Jedenfalls finde ich das so wie es ist verwirrend.
 
Das hatte ich zufällig neulich in http://www.java-forum.org/spiele-mu...-transformationen-gles1-gles2.html#post922149 erwähnt: Die Matrizen (AffineTransforms) werden miteinander multipliziert. Wenn man sowas macht wie im geposteten code, kommt dort eine Matrix raus, die "skalierung * translation" beschreibt. Wenn man einen Punkt damit transformiert, entspricht das dem hier:
Code:
neuerVertex = skalierung * translation * alterVertex
                 ^             ^
                 |             | Der Vertex wird erst transliert...
                 | ... und danach skaliert
 
Ja, ich denke, ich habe schon verstanden, was passiert.
Mich interessiert eher, warum das so gemacht wurde, da es aus meiner Sicht nicht logisch erscheint. Und es dürfte imho auch kein Problem sein, wenn man es genau andersrum implementiert hätte.
 
Sicher hätte man es auch anders machen können. Aber ... es ist eben üblich so, wie es ist: Bei allen Matrix- oder Vektorklassen, die ich kenne, bewirkt ein
A = B.mul(C);
dass danach A=B*C ist, und nicht A=C*B, bzw. dass durch A.multiplyWithSomething(X) dieses "something" von rechts dranmultipliziert wird (dort steht es ja auch 😉 )
 

Zurück
Oben