Freigeben über


Bedeutung der Transformationsreihenfolge

Ein einzelnes Matrix-Objekt kann eine einzelne Transformation oder eine Sequenz von Transformationen speichern. Letzteres wird als zusammengesetzteTransformation bezeichnet. Die Matrix einer zusammengesetzten Transformation wird durch Multiplikation der Matrizen der einzelnen Transformationen erhalten.

Bei einer zusammengesetzten Transformation ist die Reihenfolge der einzelnen Transformationen wichtig. Wenn Sie beispielsweise erst drehen, dann skalieren und dann übersetzen, erhalten Sie ein anderes Ergebnis im Vergleich dazu, wenn Sie erst übersetzen, dann drehen und dann skalieren. In Windows GDI+ werden zusammengesetzte Transformationen von links nach rechts erstellt. Wenn S, R und T Matrizen für Skalierung, Rotation bzw. Translation sind, dann ist das Produkt SRT (in dieser Reihenfolge) die Matrix der zusammengesetzten Transformation, bei der zuerst skaliert, dann rotiert und dann übersetzt wird. Die Matrix, die durch das Produkt SRT erzeugt wird, unterscheidet sich von der Matrix, die durch das Produkt TRS entsteht.

Ein Grund für die Bedeutung der Reihenfolge ist, dass Transformationen wie Rotation und Skalierung in Bezug auf den Ursprung des Koordinatensystems durchgeführt werden. Die Skalierung eines Objekts, das auf den Ursprung zentriert ist, führt zu einem anderen Ergebnis als die Skalierung eines Objekts, das vom Ursprung weg bewegt wurde. In ähnlicher Weise führt das Drehen eines Objekts, das auf den Ursprung zentriert ist, zu einem anderen Ergebnis als das Drehen eines Objekts, das vom Ursprung weg bewegt wurde.

Das folgende Beispiel kombiniert Skalierung, Rotation und Translation (in dieser Reihenfolge) zu einer zusammengesetzten Transformation. Das an die Graphics::RotateTransform-Methode übergebene Argument MatrixOrderAppend gibt an, dass die Drehung der Skalierung folgt. Ebenso gibt das an die Graphics::TranslateTransform-Methodeübergebene Argument MatrixOrderAppend an, dass die Übersetzung der Drehung folgt.

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.ScaleTransform(1.75f, 0.5f);
graphics.RotateTransform(28.0f, MatrixOrderAppend);
graphics.TranslateTransform(150.0f, 150.0f, MatrixOrderAppend);
graphics.DrawRectangle(&pen, rect);

Im folgenden Beispiel werden die gleichen Methodenaufrufe wie im vorherigen Beispiel ausgeführt, aber die Reihenfolge der Aufrufe wird umgekehrt. Die resultierende Reihenfolge der Vorgänge wird zuerst übersetzt, dann gedreht, dann skaliert, was ein ganz anderes Ergebnis als die erste Skalierung ergibt, dann rotieren und dann übersetzen:

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.TranslateTransform(150.0f, 150.0f);
graphics.RotateTransform(28.0f, MatrixOrderAppend);
graphics.ScaleTransform(1.75f, 0.5f, MatrixOrderAppend);
graphics.DrawRectangle(&pen, rect);

Eine Möglichkeit, die Reihenfolge der einzelnen Transformationen in einer zusammengesetzten Transformation umzukehren, besteht darin, die Reihenfolge einer Sequenz von Methodenaufrufen umzukehren. Eine zweite Möglichkeit zur Steuerung der Reihenfolge der Vorgänge besteht darin, das Argument für die Matrixreihenfolge zu ändern. Das folgende Beispiel entspricht dem vorherigen Beispiel, mit der Ausnahme, dass MatrixOrderAppend in MatrixOrderPrepend geändert wurde. Die Matrixmultiplikation erfolgt in der Reihenfolge SRT, wobei S, R und T die Matrizen für Skalierung, Rotation und Translation repräsentieren. Die Reihenfolge der zusammengesetzten Transformation lautet: zuerst skalieren, dann rotieren und dann übersetzen.

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.TranslateTransform(150.0f, 150.0f,MatrixOrderPrepend);
graphics.RotateTransform(28.0f, MatrixOrderPrepend);
graphics.ScaleTransform(1.75f, 0.5f, MatrixOrderPrepend);
graphics.DrawRectangle(&pen, rect);

Das Ergebnis des vorherigen Beispiels ist dasselbe Ergebnis, das wir im ersten Beispiel dieses Abschnitts erzielt haben. Das liegt daran, dass wir sowohl die Reihenfolge der Methodenaufrufe als auch die Reihenfolge der Matrixmultiplikation umgekehrt haben.