Delen via


Meerdere transformaties toepassen op een object

Als u meerdere transformaties wilt uitvoeren op een object, betekent het combineren van verschillende transformaties in één. Dat wil gezegd, het nemen van de uitvoer van elke transformatiematrix en deze gebruiken als invoer voor de volgende, waardoor de cumulatieve effecten van alle matrixtransformaties worden opgehaald.

Stel dat twee transformatiematrices, rotatie en vertaling samen worden vermenigvuldigd. Het resultaat is een nieuwe matrix die de functies van zowel rotatie als vertaling uitvoert. Omdat matrixvermenigvuldiging niet commutatief is, is een rotatietransformatie vermenigvuldigd met een translatietransformatie anders dan een translatietransformatie vermenigvuldigd met een rotatietransformatie.

In de volgende codevoorbeelden ziet u hoe u rotatie toepast gevolgd door vertaling en vervolgens vertaling gevolgd door rotatie. U ziet dat de renderingresultaten verschillen.

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);

De code produceert de uitvoer die wordt weergegeven in de volgende afbeelding.

illustratie van één rechthoek die getransleerd is en vervolgens gedraaid is, en één rechthoek die gedraaid is en vervolgens getransleerd is

Direct2D-verwijzing

Overzicht van Direct2D-transformaties