Erst mal vorweg: Ich kenne jetzt nicht den TMatrix-Datentyp von Delphi, vielleicht "macht man das da ja so", aber normalerweise multipliziert man Matrizen in die andere Richtung. So wie du es machst finde ich es eher verwirrend, weil es die Reihenfolge genau entgegengesetzt dazu ist, wie die Transformationen hinterher tatsächlich ausgeführt werden.
Mal ein aus der Luft gegriffenes Beispiel: Du willst erst einen Vektor v um einen Winkel drehen und anschließend verschieben. Wenn jetzt A die Drehmatrix ist und B die Translationsmatrix (Verschiebungsmatrix), dann ist der transformierte Vektor v' = B*A*v (
nicht A*B*v!).
Solange dein Ergebnis stimmt, ist ja alles in Ordnung, aber es ist trotzdem verwirrend und ich würde den Code so umsortieren, dass die Matrix in die andere Richtung zusammengebaut wird.
Zum eigentlichen Thema: Auf dem Delphi-DocWiki steht leider sehr wenig zum TMatrix-Datentyp, es gibt nicht mal eine Auflistung der Methoden. Leider habe ich nicht XE2 und kann daher auch nicht im Source-Code nachschauen, ob es eventuell schon eine Methode für Spiegelungen gibt.
Du kannst dir Konstanten deklarieren:
Delphi-Quellcode:
// Horizontal spiegeln
const MATRIX_FLIP_H = (M: ((X: -1; Y: 0; W: 0),
(X: 0; Y: 1; W: 0),
(X: 0; Y: 0; W: 1)));
// Vertikal spiegeln
const MATRIX_FLIP_V = (M: ((X: 1; Y: 0; W: 0),
(X: 0; Y: -1; W: 0),
(X: 0; Y: 0; W: 1)));
// Horizontal und vertikal spiegeln
const MATRIX_FLIP_DIAG = (M: ((X: -1; Y: 0; W: 0),
(X: 0; Y: -1; W: 0),
(X: 0; Y: 0; W: 1)));
Ah, na toll, die DP zerstört mal wieder die Formatierung...
(
Oh Gott, mit den ganzen Klammern sieht das ja fast aus wie LISP-Quellcode
).
Eine von diesen Matrizen müsstest du dann in deinem Quellcode an der entsprechenden Stelle dranmultiplizieren.