Partager via


Comment appliquer plusieurs transformations à un objet

Pour effectuer plusieurs transformations sur un objet, cela signifie combiner plusieurs transformations en une seule. Autrement dit, en prenant la sortie de chaque matrice de transformation et en l’utilisant comme entrée pour la suivante, obtenant ainsi les effets cumulatifs de toutes les transformations de matrice.

Supposons que deux matrices de transformation, rotation et traduction sont multipliées ensemble. Le résultat est une nouvelle matrice qui effectue les fonctions de rotation et de traduction. Étant donné que la multiplication de matrice n’est pas commutative, une transformation de rotation multipliée par une transformation de traduction est différente de la transformation de traduction multipliée par la transformation de rotation.

Les exemples de code suivants montrent comment appliquer la rotation suivie de la traduction, puis la traduction suivie de la rotation. Notez que les résultats de rendu sont différents.

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

Le code produit la sortie illustrée dans l’illustration suivante.

illustration of one rectangle that has been translated and then rotated and one rectangle that has been rotated and then translated

Référence Direct2D

Vue d’ensemble des transformations Direct2D