如何扭曲物件

若要扭曲 (或剪除) 物件,表示以 X 軸、y 軸或兩者中的指定角度扭曲物件。 例如,當您扭曲正方形時,它就會變成平行投影。

Matrix3x2F::Skew方法採用 3 個參數:

  • angleX:X 軸扭曲角度,從 y 軸反時針方向測量。
  • angleY:從 X 軸順時針測量的 y 軸扭曲角度。
  • centerPoint:執行扭曲的點。

若要預測扭曲轉換的效果,請考慮 angleX 是從 Y 軸反時鐘測量的扭曲角度。 例如,如果 angleX 設定為 30,則物件會沿著 centerPoint的 Y 軸反時針旋轉 30 度。 下圖顯示方塊左上角的水準傾斜 30 度。

正方形扭曲 30 度從 Y 軸反時針形圖例

同樣地, angleY 是從 X 軸順時針測量的扭曲角度。 例如,如果 angleY 設定為 30,則物件會沿著 中心點的 X 軸順時針傾斜 30 度。 下圖顯示方塊左上角的垂直扭曲 30 度。

從 X 軸順時針順時針旋轉 30 度方塊的圖例

如果您同時將 angleXangleY 設定為 30 度, 而 centerPoint 設定為方塊左上角,您會看到下列扭曲的方形 (實心外框) 。 請注意,扭曲的正方形從 Y 軸反時針旋轉 30 度,從 X 軸順時針旋轉 30 度。

從 Y 軸反時針方向反時針旋轉 30 度正方形的圖例,從 X 軸順時針旋轉 30 度

下列程式碼範例會水準扭曲方塊左上角的正方形 45 度。

    // Create a rectangle.
    D2D1_RECT_F rectangle = D2D1::Rect(126.0f, 301.5f, 186.0f, 361.5f);

    // Draw the outline of the rectangle.
    m_pRenderTarget->DrawRectangle(
        rectangle,
        m_pOriginalShapeBrush,
        1.0f,
        m_pStrokeStyleDash
        );

    // Apply the skew transform to the render target.
    m_pRenderTarget->SetTransform(
        D2D1::Matrix3x2F::Skew(
            45.0f,
            0.0f,
            D2D1::Point2F(126.0f, 301.5f))
        );

    // Paint the interior of the rectangle.
    m_pRenderTarget->FillRectangle(rectangle, m_pFillBrush);

    // Draw the outline of the rectangle.
    m_pRenderTarget->DrawRectangle(rectangle, m_pTransformedShapeBrush);

下圖顯示將扭曲轉換套用至方形的效果,其中原始方塊是虛線外框,而扭曲物件 (平行投影) 是實心外框。 請注意,扭曲角度是 45 度,從 Y 軸反時針方向。

正方形扭曲 45 度從 Y 軸反時針形圖例

Direct2D 轉換概觀

Direct2D 參考