如何結合幾何
本主題描述如何結合兩個幾何。 Direct2D 支援四種結合幾何的模式:Union、Intersect、XOR 和 Exclude。 這些模式是在 D2D1_COMBINE_MODE 列舉類型中指定。
使用四種模式的任一種來結合兩個幾何
- 宣告路徑幾何: ID2D1PathGeometry 類型的變數,用來儲存幾何組合的結果。
- 宣告 geometry 接收: ID2D1GeometrySink 類型的變數,其會儲存路徑幾何。
- 呼叫 ID2D1Factory::CreatePathGeometry 方法來建立路徑 geometry 物件。
- 呼叫 ID2D1PathGeometry::Open 方法,以開啟 geometry 接收物件。
- 呼叫 ID2D1EllipseGeometry::CombineWithGeometry 方法,使用四種模式之一來結合兩個幾何。
- 關閉 geometry 接收物件。
下列程式碼會宣告 ID2D1PathGeometry 和 ID2D1GeometrySink類型的變數。
ID2D1PathGeometry *m_pPathGeometryUnion;
ID2D1PathGeometry *m_pPathGeometryIntersect;
ID2D1PathGeometry *m_pPathGeometryXOR;
ID2D1PathGeometry *m_pPathGeometryExclude;
下列程式碼會使用四種模式來結合兩個 ID2D1EllipseGeometry 物件,並執行下列動作:
- 建立兩個省略號,m_spEllipseGeometryOne和m_spEllipseGeometryTwo。
- 建立路徑幾何物件。
- 開啟幾何接收物件。
- 結合兩個省略號。
- 關閉幾何接收物件。
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;
}
此程式碼會產生下圖所示的輸出。
相關主題
-
ID2D1GeometrySink