Kombinieren von Geometrien
In diesem Thema wird beschrieben, wie zwei Geometrien kombiniert werden. Direct2D unterstützt vier Modi zum Kombinieren von Geometrien: Union, Intersect, XOR und Exclude. Diese Modi werden im Enumerationstyp D2D1_COMBINE_MODE angegeben.
So kombinieren Sie zwei Geometrien mit einem der vier Modi
- Deklarieren Sie eine Pfadgeometrie: Eine Variable vom Typ ID2D1PathGeometry , die das Ergebnis der Geometriekombination speichert.
- Deklarieren Einer Geometriesenke: Eine Variable vom Typ ID2D1GeometrySink , die die Pfadgeometrie speichert.
- Erstellen Sie das path geometry-Objekt, indem Sie die ID2D1Factory::CreatePathGeometry-Methode aufrufen.
- Öffnen Sie das geometry-Senkenobjekt, indem Sie die ID2D1PathGeometry::Open-Methode aufrufen.
- Verwenden Sie einen der vier Modi, um die beiden Geometrien zu kombinieren, indem Sie die ID2D1EllipseGeometry::CombineWithGeometry-Methode aufrufen.
- Schließen Sie das Geometry-Senkenobjekt.
Der folgende Code deklariert die Variablen vom Typ ID2D1PathGeometry und ID2D1GeometrySink.
ID2D1PathGeometry *m_pPathGeometryUnion;
ID2D1PathGeometry *m_pPathGeometryIntersect;
ID2D1PathGeometry *m_pPathGeometryXOR;
ID2D1PathGeometry *m_pPathGeometryExclude;
Der folgende Code verwendet jeden der vier Modi, um die beiden ID2D1EllipseGeometry-Objekte zu kombinieren, und führt die folgenden Aktionen aus:
- Erstellt zwei Auslassungspunkte, m_spEllipseGeometryOne und m_spEllipseGeometryTwo.
- Erstellt ein Pfadgeometrieobjekt.
- Öffnet ein Geometriesenkenobjekt.
- Kombiniert die beiden Auslassungspunkte.
- Schließt das Geometry-Senkenobjekt.
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;
}
Dieser Code erzeugt die in der folgenden Abbildung gezeigte Ausgabe.
Zugehörige Themen
-
ID2D1GeometrySink