Cara Menerapkan Beberapa Transformasi ke Objek

Untuk melakukan beberapa transformasi pada objek berarti menggabungkan beberapa transformasi menjadi satu. Artinya, mengambil output dari setiap matriks transformasi dan menggunakannya sebagai input untuk yang berikutnya, sehingga mendapatkan efek kumulatif dari semua transformasi matriks.

Misalkan dua matriks transformasi, rotasi dan terjemahan, dikalikan bersama-sama. Hasilnya adalah matriks baru yang melakukan fungsi rotasi dan terjemahan. Karena perkalian matriks tidak komutatif, transformasi rotasi yang dikalikan dengan transformasi terjemahan berbeda dari transformasi terjemahan dikalikan dengan transformasi rotasi.

Contoh kode berikut menunjukkan cara menerapkan rotasi diikuti dengan terjemahan, lalu terjemahan diikuti dengan rotasi. Perhatikan bahwa hasil penyajian berbeda.

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

Kode menghasilkan output yang ditunjukkan dalam ilustrasi berikut.

ilustrasi satu persegi panjang yang telah diterjemahkan dan kemudian diputar dan satu persegi panjang yang telah diputar dan kemudian diterjemahkan

Referensi Direct2D

Gambaran Umum Transformasi Direct2D