Udostępnij za pośrednictwem


Jak przekształcić geometrię

Aby przekształcić geometrię, możesz zastosować przekształcenie do obiektu docelowego renderowania, wywołując SetTransform lub stosując przekształcenie do geometrii, wywołując CreateTransformedGeometry. Chociaż oba podejścia przekształcają geometrię, mają pewne podstawowe różnice. CreateTransformedGeometry oddziałuje na wypełnienie, ale nie wpływa na szerokość obrysu. Ponadto CreateTransformedGeometry przekształca samą geometrię bez wpływu na inne kształty na obiekcie docelowym renderowania, podczas gdy SetTransform stosuje przekształcenie do wszystkich kształtów na obiekcie docelowym renderowania.

W tym temacie z instrukcjami opisano sposób przekształcania geometrii przez wywołanie metody CreateTransformedGeometry.

Aby przekształcić geometrię

  1. Zadeklaruj zmienną ID2D1TransformedGeometry.
  2. Wywołaj metodę CreateTransformedGeometry, aby utworzyć przekształconą geometrię.

Poniższy kod pokazuje, jak utworzyć klepsydrę, przekształcić klepsydrę i narysować oryginalne oraz wynikowe klepsydry.

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