Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieses Thema enthält eine mathematische Übersicht über Matrixtransformationen für 2D-Grafiken. Sie müssen jedoch keine Matrixmathematik kennen, um Transformationen in Direct2D zu verwenden. Lesen Sie dieses Thema, wenn Sie an der Mathematik interessiert sind. andernfalls können Sie dieses Thema überspringen.
Einführung in Matrizen
Eine Matrix ist ein rechteckiges Array realer Zahlen. Die Reihenfolge der Matrix ist die Anzahl der Zeilen und Spalten. Wenn die Matrix beispielsweise drei Zeilen und 2 Spalten enthält, beträgt die Reihenfolge 3 × 2. Matrizen werden in der Regel mit den Matrixelementen angezeigt, die in eckige Klammern eingeschlossen sind:
Schreibweise: Eine Matrix wird durch einen Großbuchstaben festgelegt. Elemente werden durch Kleinbuchstaben gekennzeichnet. Tiefgestellte geben die Zeilen- und Spaltennummer eines Elements an. Beispielsweise ist einij das Element in der i'th Zeile und j'th Spalte der Matrix A.
Das folgende Diagramm zeigt eine i × j-Matrix mit den einzelnen Elementen in jeder Zelle der Matrix.
Matrixvorgänge
In diesem Abschnitt werden die grundlegenden Vorgänge beschrieben, die für Matrizen definiert sind.
Addition. Die Summe A + B von zwei Matrizen wird durch Hinzufügen der entsprechenden Elemente von A und B abgerufen:
- A + B = \[ a*ij* \] + \[ b*ij* \] = \[ a*ij* + b*ij* \]
Skalare Multiplikation. Dieser Vorgang multipliziert eine Matrix um eine reelle Zahl. Bei einer reellen Zahl kwird das skalare Produkt kA durch Multiplizieren jedes Elements von A durch k.
- kA = k\[ a*ij* \] = \[ k × a*ij* \]
Matrixmultiplikation. Bei zwei Matrizen A und B mit Bestellung (m × n) und (n × p) ist das Produkt C = A × B eine Matrix mit Der Reihenfolge (m × p), die wie folgt definiert ist:
oder, gleichbedeutend:
- c*ij* = a*i*1 x b1*j* + a*i*2 x b2*j* + ... + a*in* + b*nj*
Gehen Sie folgendermaßen vor, um jedes Element cijzu berechnen:
- Nehmen Sie die erste Zeile von A und die j'th Spalte von B.
- Multiplizieren Sie jedes Elementpaar in der Zeile und Spalte: der erste Zeileneintrag durch den ersten Spalteneintrag, den zweiten Zeileneintrag durch den zweiten Spalteneintrag usw.
- Summieren Sie das Ergebnis.
Hier ist ein Beispiel für die Multiplikation einer (2 × 2)-Matrix mit einer (2 × 3)-Matrix.
Die Matrixmultiplikation ist nicht kommutativ. Das heißt, A × B ≠ B × A. Aus der Definition folgt auch, dass nicht jedes Matrizenpaar multipliziert werden kann. Die Anzahl der Spalten in der linken Matrix muss der Anzahl von Zeilen in der rechten Matrix entsprechen. Andernfalls ist der ×-Operator nicht definiert.
Matrix-identifizieren . Eine Als I festgelegte Identitätsmatrix ist eine quadratische Matrix, die wie folgt definiert ist:
- I*ij* = 1, wenn *i* = *j*, oder 0 andernfalls.
Mit anderen Worten, eine Identitätsmatrix enthält 1 für jedes Element, wobei die Zeilennummer der Spaltennummer entspricht, und null für alle anderen Elemente. Hier ist beispielsweise die 3 × 3 Identitätsmatrix.
Die folgenden Gleichheitszeichen für eine beliebige Matrix M.
- M x I = M I x M = M
Affine Transformationen
Eine affine Transformation ist ein mathematischer Vorgang, der einen Koordinatenbereich einem anderen zuordnet. Mit anderen Worten: Sie ordnet einen Satz von Punkten einem anderen Satz von Punkten zu. Affine Transformationen verfügen über einige Features, die sie in Computergrafiken nützlich machen.
- Affine Transformationen erhalten Kollinearität. Wenn drei oder mehr Punkte auf eine Linie fallen, bilden sie nach der Transformation noch eine Linie. Gerade Linien bleiben gerade.
- Die Zusammensetzung von zwei affinen Transformationen ist eine affine Transformation.
Affine Transformationen für 2D-Leerzeichen weisen das folgende Formular auf.
Wenn Sie die Definition der zuvor angegebenen Matrixmultiplikation anwenden, können Sie zeigen, dass das Produkt von zwei affinen Transformationen eine weitere affine Transformation ist. Um einen 2D-Punkt mithilfe einer affinen Transformation zu transformieren, wird der Punkt als 1 × 3-Matrix dargestellt.
- P = \| x y 1 \|
Die ersten beiden Elemente enthalten die x- und y-Koordinaten des Punkts. Die 1 wird im dritten Element platziert, um die mathematische Arbeit korrekt zu gestalten. Um die Transformation anzuwenden, multiplizieren Sie die beiden Matrizen wie folgt.
- P' = P × M
Dies wird auf Folgendes erweitert.
wo
- x' = ax + cy + e y' = bx + dy + f
Um den transformierten Punkt abzurufen, nehmen Sie die ersten beiden Elemente der Matrix P'.
- p = (x', y') = (ax + cy + e, bx + dy + f)
Anmerkung
Eine 1 × n Matrix wird als Zeilenvektorbezeichnet. Direct2D und Direct3D verwenden beide Zeilenvektoren, um Punkte im 2D- oder 3D-Raum darzustellen. Sie können ein entsprechendes Ergebnis erhalten, indem Sie einen Spaltenvektor (n × 1) verwenden und die Transformationsmatrix transponieren. Die meisten Grafiktexte verwenden das Spaltenvektorformular. In diesem Thema wird das Zeilenvektorformular für die Konsistenz mit Direct2D und Direct3D dargestellt.
Die nächsten Abschnitte leiten die grundlegenden Transformationen ab.
Übersetzungstransformation
Die Übersetzungstransformationsmatrix weist das folgende Formular auf.
Wenn Sie einen Punkt P- in diese Gleichung anschließen, wird Folgendes erzielt:
- P' = (*x* + *dx*, *y* + *dy*)
die dem punkt (x, y) entspricht, der von dx in der X-Achse und dy in der Y-Achse übersetzt wird.
Skalierungstransformation
Die Skalierungstransformationsmatrix weist das folgende Formular auf.
Wenn Sie einen Punkt P- in diese Gleichung anschließen, wird Folgendes erzielt:
- P' = (*x* ** *dx*, *y* ** *dy*)
die dem punkt (x,y) entspricht, der um dx und dyskaliert wird.
Drehung um den Ursprung
Die Matrix zum Drehen eines Punkts um den Ursprung weist das folgende Formular auf.
Der transformierte Punkt lautet:
- P' = (*x*cosΘ – ysinΘ, *x*sinΘ + *y*cosΘ)
Beweis. Um anzuzeigen, dass P eine Drehung darstellt, betrachten Sie das folgende Diagramm.
Gegeben:
-
P = (x,y)
-
Der ursprüngliche zu transformierenden Punkt.
-
Φ
-
Der Winkel, der durch die Linie (0,0) bis P gebildet wird.
-
Θ
-
Der Winkel, um den der Ursprung gedreht werden soll (x,y).
-
P' = (x',y')
-
Der transformierte Punkt.
-
R
-
Die Länge der Zeile (0,0) bis P. Auch der Radius des Kreises der Drehung.
Anmerkung
In diesem Diagramm wird das Standardkoordinatensystem verwendet, das in der Geometrie verwendet wird, wobei die positive Y-Achse nach oben zeigt. Direct2D verwendet das Windows-Koordinatensystem, wobei die positive Y-Achse nach unten zeigt.
Der Winkel zwischen der X-Achse und der Linie (0,0) zu P' ist Ф + Ф. Die folgenden Identitäten enthalten:
- x = R cosФ y = R sinФ x' = R cos(Ф + Ф) y' = R sin(Ф+ Ф)
Jetzt lösen sie für x' und y' in Bezug auf Θ. Durch die trigonometrischen Additionsformeln:
- x' = R(cosФcosФ – sinФsinФ) = RcosФcosФ – RsinФsinФ y' = R(sinФcosФ + cosФsinФ) = RsinФcosФ + RcosФsinФ
Substituieren, wir erhalten Folgendes:
- x' = xcosΘ – ysinΘ y' = xsinΘ + ycosΘ
die dem zuvor gezeigten transformierten Punkt P entspricht.
Drehen um einen beliebigen Punkt
Um einen anderen Punkt (x,y) als den Ursprung zu drehen, wird die folgende Matrix verwendet.
Sie können diese Matrix ableiten, indem Sie den Punkt (x,y) als Ursprung verwenden.
Let (x1, y1) be the point that results from rotating the point (x0, y0) around the point (x,y). Wir können x1 wie folgt ableiten.
- x1 = (x0 – x)cosΘ– (y0 – y)sinΘ + x1 = x0cosΘ – y0sinΘ + \[ (1 – cosΘ) + ysinΘ \]
Schließen Sie diese Formel nun mit der Formel x1 = ax0 + cy0 + e aus früheren Versionen wieder in die Transformationsmatrix ein. Verwenden Sie dasselbe Verfahren, um y1 abzuleiten.
Schiefe Transformation
Die schiefe Transformation wird durch vier Parameter definiert:
- Θ: Der Wert, der entlang der X-Achse schief wird, gemessen als Winkel von der Y-Achse.
- Ф: Der Wert, der entlang der Y-Achse schief wird, gemessen als Winkel von der X-Achse.
- (px, py): Die x- und y-Koordinaten des Punkts, an dem die Neigung ausgeführt wird.
Die schiefe Transformation verwendet die folgende Matrix.
Der transformierte Punkt lautet:
- P' = (*x* + *y*tanФ – *py*tanФ, *y* + *x*tanФ) – *py*tanФ
oder gleichwertig:
- P' = (*x* + (*y* – *py*)tanФ, *y* + (*x* – *px*)tanФ)
Um zu sehen, wie diese Transformation funktioniert, berücksichtigen Sie jede Komponente einzeln. Der Θ-Parameter verschiebt jeden Punkt in der x-Richtung um einen Betrag, der tanΘ entspricht. Das folgende Diagramm zeigt die Beziehung zwischen Θ und der Neigung der X-Achse.
Dies ist die gleiche Schiefe, die auf ein Rechteck angewendet wird:
Der Ф-Parameter hat denselben Effekt, aber entlang der y-Achse:
Das nächste Diagramm zeigt eine y-Achsen-Neigung, die auf ein Rechteck angewendet wird.
Schließlich px und py den Mittelpunkt für die Neigung entlang der X- und Y-Achse verschieben.
Darstellen von Transformationen in Direct2D
Alle Direct2D-Transformationen sind affine Transformationen. Direct2D unterstützt keine nicht affinen Transformationen. Transformationen werden durch die D2D1_MATRIX_3X2_F Struktur dargestellt. Diese Struktur definiert eine 3 × 2-Matrix. Da die dritte Spalte einer affinen Transformation immer gleich ist ([0, 0, 1]), und da Direct2D keine nicht affinen Transformationen unterstützt, müssen Sie die gesamte 3 × 3-Matrix nicht angeben. Intern verwendet Direct2D 3 × 3 Matrizen, um die Transformationen zu berechnen.
Die Member der D2D1_MATRIX_3X2_F werden gemäß ihrer Indexposition benannt: das _11 Element ist Element (1,1), das _12 Element ist (1,2) usw. Obwohl Sie die Strukturmmber direkt initialisieren können, empfiehlt es sich, die D2D1::Matrix3x2F--Klasse zu verwenden. Diese Klasse erbt D2D1_MATRIX_3X2_F und stellt Hilfsmethoden zum Erstellen einer der grundlegenden affinen Transformationen bereit. Die Klasse definiert auch Operator*() zum Verfassen von zwei oder mehr Transformationen, wie in Anwenden von Transformationen in Direct2D-beschrieben.
Nächster