次の方法で共有


ジオメトリを変換する方法

ジオメトリを変換するには、SetTransform を呼び出してレンダー ターゲットに変換を適用するか、CreateTransformedGeometry を呼び出して変換をジオメトリに適用します。 どちらのアプローチもジオメトリを変換しますが、いくつかの基本的な違いがあります。 CreateTransformedGeometry は塗りつぶしに影響しますが、ストロークの幅には影響しません。 さらに、 CreateTransformedGeometry はレンダー ターゲット上の他の図形に影響を与えずにジオメトリのみを変換しますが、 SetTransform は レンダー ターゲット上のすべての図形に変換を適用します。

このハウツー トピックでは、 CreateTransformedGeometry を呼び出してジオメトリを変換する方法について説明します。

ジオメトリを変換するには

  1. ID2D1TransformedGeometry 変数を宣言します。
  2. CreateTransformedGeometry メソッドを呼び出して、変換されたジオメトリを作成します。

次のコードは、1 時間のグラスを作成し、時間グラスを変換し、元の時間グラスと結果の時間グラスを描画する方法を示しています。

// Create a path geometry.
if (SUCCEEDED(hr))
{
    hr = m_pD2DFactory->CreatePathGeometry(&m_pPathGeometry);

    if (SUCCEEDED(hr))
    {
        // Write to the path geometry using the geometry sink.
        hr = m_pPathGeometry->Open(&pSink);

        if (SUCCEEDED(hr))
        {
            pSink->BeginFigure(
                D2D1::Point2F(0, 0),
                D2D1_FIGURE_BEGIN_FILLED
                );

            pSink->AddLine(D2D1::Point2F(200, 0));

            pSink->AddBezier(
                D2D1::BezierSegment(
                    D2D1::Point2F(150, 50),
                    D2D1::Point2F(150, 150),
                    D2D1::Point2F(200, 200))
                );

            pSink->AddLine(D2D1::Point2F(0, 200));

            pSink->AddBezier(
                D2D1::BezierSegment(
                    D2D1::Point2F(50, 150),
                    D2D1::Point2F(50, 50),
                    D2D1::Point2F(0, 0))
                );

            pSink->EndFigure(D2D1_FIGURE_END_CLOSED);

            hr = pSink->Close();
        }
        SafeRelease(&pSink);
    }
}

if (SUCCEEDED(hr))
{
    // Create a transformed geometry which is tilted at an angle to the previous geometry
    hr = m_pD2DFactory->CreateTransformedGeometry(
        m_pPathGeometry,
        D2D1::Matrix3x2F::Rotation(
            45.f,
            D2D1::Point2F(100, 100)),
        &m_pTransformedGeometry
        );
}