Anwenden mehrerer Transformationen auf ein Objekt

Wenn Sie mehrere Transformationen für ein Objekt ausführen möchten, müssen Sie mehrere Transformationen zu einer transformation kombinieren. Das heißt, die Ausgabe aus jeder Transformationsmatrix zu verwenden und sie als Eingabe für die nächste zu verwenden, wodurch die kumulativen Effekte aller Matrixtransformationen abgerufen werden.

Angenommen, zwei Transformationsmatrizen, Rotation und Übersetzung, werden miteinander multipliziert. Das Ergebnis ist eine neue Matrix, die sowohl die Funktionen der Drehung als auch der Übersetzung ausführt. Da die Matrixmultiplikation nicht kommutativ ist, unterscheidet sich eine Rotationstransformation multipliziert mit einer Übersetzungstransformation von der Übersetzungstransformation multipliziert mit der Rotationstransformation.

Die folgenden Codebeispiele zeigen, wie Die Drehung gefolgt von der Übersetzung und dann der Übersetzung gefolgt von der Drehung angewendet wird. Beachten Sie, dass sich die Renderingergebnisse unterscheiden.

D2D1_RECT_F rectangle = D2D1::RectF(300.0f, 40.0f, 360.0f, 100.0f);

// Draw the rectangle before transforming the render target.

m_pRenderTarget->DrawRectangle(
    rectangle,
    m_pOriginalShapeBrush,
    1.0f,
    m_pStrokeStyleDash
    );

D2D1_MATRIX_3X2_F rotation = D2D1::Matrix3x2F::Rotation(
    45.0f,
    D2D1::Point2F(330.0f, 70.0f)
    );


D2D1_MATRIX_3X2_F translation = D2D1::Matrix3x2F::Translation(20.0f, 10.0f);

// First rotate about the center of the square and then move
// 20 pixels to the right along the x-axis
// and 10 pixels downward along the y-axis.
m_pRenderTarget->SetTransform(rotation* translation);

// Draw the rectangle in the transformed space.
m_pRenderTarget->FillRectangle(rectangle, m_pFillBrush);
m_pRenderTarget->DrawRectangle(rectangle, m_pTransformedShapeBrush, 1.0f);
D2D1_RECT_F rectangle = D2D1::Rect(40.0f, 40.0f, 100.0f, 100.0f);

// Draw a rectangle without transforming it.
m_pRenderTarget->DrawRectangle(
    rectangle,
    m_pOriginalShapeBrush,
    1.0f,
    m_pStrokeStyleDash
    );

D2D1_MATRIX_3X2_F translation = D2D1::Matrix3x2F::Translation(20.0f, 10.0f);

m_pRenderTarget->SetTransform(translation);

D2D1_MATRIX_3X2_F rotation = D2D1::Matrix3x2F::Rotation(
    45.0f,
    D2D1::Point2F(70.0f, 70.0f)
    );

// First move 20 pixels to the right along the x-axis and
// 10 pixels downward along the y-axis,
// and then rotate about the center of the original square.
m_pRenderTarget->SetTransform(translation * rotation);

// Draw the rectangle in the transformed space.
m_pRenderTarget->FillRectangle(rectangle, m_pFillBrush);
m_pRenderTarget->DrawRectangle(rectangle, m_pTransformedShapeBrush);

Der Code erzeugt die in der folgenden Abbildung gezeigte Ausgabe.

Abbildung eines Rechtecks, das übersetzt und dann gedreht wurde, und eines Rechtecks, das gedreht und dann übersetzt wurde

Direct2D-Referenz

Übersicht über Direct2D-Transformationen