ジオメトリを結合する方法
このトピックでは、2 つのジオメトリを結合する方法について説明します。 Direct2D では、ジオメトリを結合するための 4 つのモード (Union、Intersect、XOR、Exclude) がサポートされています。 これらのモードは、 D2D1_COMBINE_MODE 列挙型で指定されます。
4 つのモードのいずれかを使用して 2 つのジオメトリを結合するには
- パス ジオメトリを宣言する: ジオメトリの組み合わせの結果を格納する ID2D1PathGeometry 型の変数。
- geometry シンクを宣言する: パス ジオメトリを格納する ID2D1GeometrySink 型の変数。
- ID2D1Factory::CreatePathGeometry メソッドを呼び出して、パス geometry オブジェクトを作成します。
- ID2D1PathGeometry::Open メソッドを呼び出して、geometry シンク オブジェクトを開きます。
- ID2D1EllipseGeometry::CombineWithGeometry メソッドを呼び出して、4 つのモードのいずれかを使用して 2 つのジオメトリを結合します。
- ジオメトリ シンク オブジェクトを閉じます。
次のコードでは、 ID2D1PathGeometry 型と ID2D1GeometrySink 型の変数を宣言します。
ID2D1PathGeometry *m_pPathGeometryUnion;
ID2D1PathGeometry *m_pPathGeometryIntersect;
ID2D1PathGeometry *m_pPathGeometryXOR;
ID2D1PathGeometry *m_pPathGeometryExclude;
次のコードでは、4 つのモードのそれぞれを使用して 2 つの ID2D1EllipseGeometry オブジェクトを結合し、次のアクションを実行します。
- m_spEllipseGeometryOneとm_spEllipseGeometryTwoの 2 つの省略記号を作成します。
- パス ジオメトリ オブジェクトを作成します。
- ジオメトリ シンク オブジェクトを開きます。
- 2 つの省略記号を結合します。
- ジオメトリ シンク オブジェクトを閉じます。
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