다음을 통해 공유


기하 도형을 결합하는 방법

이 항목에서는 두 기하 도형을 결합하는 방법에 대해 설명합니다. Direct2D는 기하 도형을 결합하는 네 가지 모드인 Union, Intersect, XOR 및 Exclude를 지원합니다. 이러한 모드는 D2D1_COMBINE_MODE 열거형 형식에 지정됩니다.

4가지 모드 중 하나라도 사용하여 두 기하 도형을 결합하려면

  1. 경로 기하 도형을 선언합니다. 기하 도형 조합의 결과를 저장할 ID2D1PathGeometry 형식의 변수입니다.
  2. 기하 도형 싱크를 선언합니다. 경로 기하 도형을 저장할 ID2D1GeometrySink 형식의 변수입니다.
  3. ID2D1Factory::CreatePathGeometry 메서드를 호출하여 경로 geometry 개체를 만듭니다.
  4. ID2D1PathGeometry::Open 메서드를 호출하여 geometry 싱크 개체를 엽니다.
  5. 4가지 모드 중 하나를 사용하여 ID2D1EllipseGeometry::CombineWithGeometry 메서드를 호출하여 두 기하 도형을 결합합니다.
  6. geometry 싱크 개체를 닫습니다.

다음 코드는 ID2D1PathGeometryID2D1GeometrySink 형식의 변수를 선언합니다.

    ID2D1PathGeometry *m_pPathGeometryUnion;
    ID2D1PathGeometry *m_pPathGeometryIntersect;
    ID2D1PathGeometry *m_pPathGeometryXOR;
    ID2D1PathGeometry *m_pPathGeometryExclude;

다음 코드는 네 가지 모드를 각각 사용하여 두 ID2D1EllipseGeometry 개체를 결합하고 다음 작업을 수행합니다.

  • m_spEllipseGeometryOne 및 m_spEllipseGeometryTwo 두 개의 타원을 만듭니다.
  • 경로 기하 도형 개체를 만듭니다.
  • 기하 도형 싱크 개체를 엽니다.
  • 두 타원을 결합합니다.
  • geometry 싱크 개체를 닫습니다.
HRESULT DemoApp::CreateGeometryResources()
{
    HRESULT hr = S_OK;
    ID2D1GeometrySink *pGeometrySink = NULL;

    // Create the first ellipse geometry to merge.
    const D2D1_ELLIPSE circle1 = D2D1::Ellipse(
        D2D1::Point2F(75.0f, 75.0f),
        50.0f,
        50.0f
        );

    hr = m_pD2DFactory->CreateEllipseGeometry(
        circle1,
        &m_pCircleGeometry1
        );

    if (SUCCEEDED(hr))
    {
        // Create the second ellipse geometry to merge.
        const D2D1_ELLIPSE circle2 = D2D1::Ellipse(
            D2D1::Point2F(125.0f, 75.0f),
            50.0f,
            50.0f
            );

        hr = m_pD2DFactory->CreateEllipseGeometry(circle2, &m_pCircleGeometry2);
    }


    if (SUCCEEDED(hr))
    {
        //
        // Use D2D1_COMBINE_MODE_UNION to combine the geometries.
        //
        hr = m_pD2DFactory->CreatePathGeometry(&m_pPathGeometryUnion);

        if (SUCCEEDED(hr))
        {
            hr = m_pPathGeometryUnion->Open(&pGeometrySink);

            if (SUCCEEDED(hr))
            {
                hr = m_pCircleGeometry1->CombineWithGeometry(
                    m_pCircleGeometry2,
                    D2D1_COMBINE_MODE_UNION,
                    NULL,
                    NULL,
                    pGeometrySink
                    );
            }

            if (SUCCEEDED(hr))
            {
                hr = pGeometrySink->Close();
            }

            SafeRelease(&pGeometrySink);
        }
    }

    if (SUCCEEDED(hr))
    {
        //
        // Use D2D1_COMBINE_MODE_INTERSECT to combine the geometries.
        //
        hr = m_pD2DFactory->CreatePathGeometry(&m_pPathGeometryIntersect);

        if (SUCCEEDED(hr))
        {
            hr = m_pPathGeometryIntersect->Open(&pGeometrySink);

            if (SUCCEEDED(hr))
            {
                hr = m_pCircleGeometry1->CombineWithGeometry(
                    m_pCircleGeometry2,
                    D2D1_COMBINE_MODE_INTERSECT,
                    NULL,
                    NULL,
                    pGeometrySink
                    );
            }

            if (SUCCEEDED(hr))
            {
                hr = pGeometrySink->Close();
            }

            SafeRelease(&pGeometrySink);
        }
    }

    if (SUCCEEDED(hr))
    {
        //
        // Use D2D1_COMBINE_MODE_XOR to combine the geometries.
        //
        hr = m_pD2DFactory->CreatePathGeometry(&m_pPathGeometryXOR);

        if (SUCCEEDED(hr))
        {
            hr = m_pPathGeometryXOR->Open(&pGeometrySink);

            if (SUCCEEDED(hr))
            {
                hr = m_pCircleGeometry1->CombineWithGeometry(
                    m_pCircleGeometry2,
                    D2D1_COMBINE_MODE_XOR,
                    NULL,
                    NULL,
                    pGeometrySink
                    );
            }

            if (SUCCEEDED(hr))
            {
                hr = pGeometrySink->Close();
            }

            SafeRelease(&pGeometrySink);
        }
    }

    if (SUCCEEDED(hr))
    {
        //
        // Use D2D1_COMBINE_MODE_EXCLUDE to combine the geometries.
        //
        hr = m_pD2DFactory->CreatePathGeometry(&m_pPathGeometryExclude);

        if (SUCCEEDED(hr))
        {
            hr = m_pPathGeometryExclude->Open(&pGeometrySink);

            if (SUCCEEDED(hr))
            {
                hr = m_pCircleGeometry1->CombineWithGeometry(
                    m_pCircleGeometry2,
                    D2D1_COMBINE_MODE_EXCLUDE,
                    NULL,
                    NULL,
                    pGeometrySink
                    );
            }

            if (SUCCEEDED(hr))
            {
                hr = pGeometrySink->Close();
            }

            SafeRelease(&pGeometrySink);
        }
    }

    return hr;
}

이 코드는 다음 그림에 표시된 출력을 생성합니다.

기하 도형을 결합하기 위한 두 개의 기하 도형과 네 가지 모드(union, intersection, xor 및 exclude)를 보여주는 그림

D2D1_COMBINE_MODE

ID2D1EllipseGeometry

ID2D1PathGeometry

ID2D1GeometrySink