Matrixdarstellung von Transformationen
Bei einer m×n-Matrix handelt es sich um eine Reihe von Zahlen, die in m Zeilen und n Spalten angeordnet sind. Die folgende Abbildung zeigt mehrere Matrizen:
Sie können zwei gleich große Matrizen addieren, indem Sie einzelne Elemente addieren. Die folgende Abbildung zeigt zwei Beispiele für Matrixaddition:
Eine m×n-Matrix kann mit einer n×p-Matrix multipliziert werden. Das Ergebnis ist eine m×p-Matrix. Die Anzahl von Spalten in der ersten Matrix muss mit der Anzahl von Zeilen in der zweiten Matrix identisch sein. Beispielsweise kann eine 4×2-Matrix mit einer 2×3-Matrix multipliziert werden, um eine 4×3-Matrix zu erhalten.
Punkte in der Ebene und Zeilen und Spalten einer Matrix können als Vektoren betrachtet werden. (2, 5) ist beispielsweise ein Vektor mit zwei Komponenten, und (3, 7, 1) ist ein Vektor mit drei Komponenten. Das Punktprodukt zweier Vektoren ist wie folgt definiert:
(a, b) • (c, d) = ac + bd
(a, b, c) • (d, e, f) = ad + be + cf
Das Punktprodukt von (2, 3) und (5, 4) ist beispielsweise (2)(5) + (3)(4) = 22. Das Punktprodukt von (2, 5, 1) und (4, 3, 1) ist (2)(4) + (5)(3) + (1)(1) = 24. Beachten Sie, dass das Punktprodukt zweier Vektoren kein weiterer Vektor, sondern eine Zahl ist. Beachten Sie außerdem, dass Sie das Punktprodukt nur berechnen können, wenn die beiden Vektoren die gleiche Anzahl von Komponenten haben.
A(i, j) sei der Eintrag in Matrix A in der i-ten Zeile und der j-ten Spalte. A(3, 2) ist also beispielsweise der Eintrag in Matrix A in der 3. Zeile und der 2. Spalte. Angenommen, A, B und C sind Matrizen und AB = C. Die Einträge von C werden wie folgt berechnet:
C(i, j) = (Zeile i von A) • (Spalte j von B)
Die folgende Abbildung zeigt mehrere Beispiele für Matrixmultiplikation:
Wenn Sie einen Punkt in einer Ebene als 1×2-Matrix betrachten, können Sie diesen Punkt transformieren, indem Sie ihn mit einer 2×2-Matrix multiplizieren. Die folgende Abbildung zeigt mehrere Transformationen, die auf den Punkt (2, 1) angewendet werden:
Alle in der vorherigen Abbildung gezeigten Transformationen sind lineare Transformationen. Bestimmte andere Transformationen wie etwa Translation sind nicht linear und können nicht als Multiplikation mit einer 2×2-Matrix ausgedrückt werden. Angenommen, Sie möchten mit dem Punkt (2, 1) beginnen, eine 90-Grad-Drehung durchführen und den Punkt um drei Einheiten in x-Richtung und um vier Einheiten in y-Richtung verschieben. Hierzu können Sie eine Matrixmultiplikation mit anschließender Matrixaddition verwenden:
Eine lineare Transformation (Multiplikation mit einer 2×2-Matrix) mit anschließender Translation (Addition einer 1×2-Matrix) wird als affine Transformation bezeichnet. Eine Alternative zur Speicherung einer affinen Transformation in einem Matrizenpaar (eine für den linearen Teil und eine für die Translation) besteht darin, die gesamte Transformation in einer 3×3-Matrix zu speichern. Hierzu muss ein Punkt in der Ebene in einer 1×3-Matrix mit einer dritten Pseudokoordinate gespeichert werden. Üblicherweise wird für alle dritten Koordinaten der Wert 1 verwendet. Der Punkt (2, 1) wird also beispielsweise durch die Matrix [2 1 1] dargestellt. Die folgende Abbildung zeigt eine affine Transformation (90-Grad-Drehung sowie Verschiebung um drei Einheiten in x-Richtung und um vier Einheiten in y-Richtung) als Multiplikation mit einer einzelnen 3×3-Matrix:
Im vorherigen Beispiel wird der Punkt (2, 1) dem Punkt (2, 6) zugeordnet. Wie Sie sehen, enthält die dritte Spalte der Matrix 3×3 die Zahlen 0, 0, 1. Das ist bei der 3×3-Matrix einer affinen Transformation immer so. Die wichtigen Zahlen sind die sechs Zahlen in den Spalten 1 und 2. Der linke obere 2×2-Teil der Matrix stellt den linearen Teil der Transformation dar. Bei den ersten beiden Einträgen in der 3. Zeile handelt es sich um die Translation.
In GDI+ können Sie eine affine Transformation in einem Matrix-Objekt speichern. Da die dritte Spalte einer Matrix, die eine affine Transformation darstellt, immer (0, 0, 1) ist, geben Sie nur die sechs Zahlen in den ersten beiden Spalten an, wenn Sie ein Matrix-Objekt erstellen. Die Anweisung Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4)
erstellt die Matrix aus der obigen Abbildung.
Zusammengesetzte Transformationen
Eine zusammengesetzte Transformation ist eine Sequenz von Transformationen (eine nach der anderen). Sehen Sie sich die Matrizen und Transformationen in der folgenden Liste an:
Matrix | Transformation |
---|---|
Matrix A | Um 90 Grad drehen |
Matrix B | Um den Faktor 2 in x-Richtung skalieren |
Matrix C | Drei Einheiten in y-Richtung verschieben |
Wenn wir mit dem Punkt (2, 1) beginnen – dargestellt durch die Matrix [2 1 1] – und ihn mit A, mit B und anschließend mit C multiplizieren, durchläuft der Punkt (2, 1) die drei Transformationen in der angegebenen Reihenfolge.
[2 1 1]ABC = [-2 5 1]
Anstatt die drei Teile der zusammengesetzten Transformation in drei separaten Matrizen zu speichern, können Sie A, B und C gemeinsam multiplizieren, um eine einzelne 3×3-Matrix zu erhalten, die die gesamte zusammengesetzte Transformation speichert. Wenn ABC = D ist, liefert ein mit D multiplizierter Punkt das gleiche Ergebnis wie ein Punkt, der mit A, mit B und anschließend mit C multipliziert wird.
[2 1 1]D = [-2 5 1]
Die folgende Abbildung zeigt die Matrizen A, B, C und D:
Die Tatsache, dass die Matrix einer zusammengesetzten Transformation durch Multiplizieren der einzelnen Transformationsmatrizen gebildet werden kann, bedeutet, dass jede Sequenz affiner Transformationen in einem einzelnen Matrix-Objekt gespeichert werden kann.
Achtung
Die Reihenfolge einer zusammengesetzten Transformation ist wichtig. Im Allgemeinen ist Drehen > Skalieren > Verschieben nicht das Gleiche wie Skalieren > Drehen > Verschieben. Auch die Reihenfolge der Matrixmultiplikation ist wichtig. ABC ist im Allgemeinen nicht das Gleiche wie BAC.
Die Klasse Matrix bietet mehrere Methoden zur Erstellung einer zusammengesetzten Transformation: Multiply, Rotate, RotateAt, Scale, Shear und Translate. Im folgenden Beispiel wird die Matrix einer zusammengesetzten Transformation erstellt. Dabei wird zuerst eine 30-Grad-Drehung durchgeführt. Danach folgen eine Skalierung um den Faktor 2 in y-Richtung und eine Verschiebung um fünf Einheiten in x-Richtung:
Matrix myMatrix = new Matrix();
myMatrix.Rotate(30);
myMatrix.Scale(1, 2, MatrixOrder.Append);
myMatrix.Translate(5, 0, MatrixOrder.Append);
Dim myMatrix As New Matrix()
myMatrix.Rotate(30)
myMatrix.Scale(1, 2, MatrixOrder.Append)
myMatrix.Translate(5, 0, MatrixOrder.Append)
Die folgende Abbildung zeigt die Matrix:
Siehe auch
.NET Desktop feedback