D2D1_FILL_MODE 列挙型
複合ジオメトリの領域を形成するためにジオメトリまたは図の交差領域がどのように組み合わさっているかを指定します。
構文
typedef enum {
D2D1_FILL_MODE_ALTERNATE = 0,
D2D1_FILL_MODE_WINDING = 1
} D2D1_FILL_MODE;
定数
D2D1_FILL_MODE_ALTERNATE
点が塗りつぶし領域に含まれるかどうかを判断するには、その点から任意の方向に無限にレイを描画してから、そのレイが交差する特定の図形内のパス セグメント数をカウントします。この数値が奇数の場合、点は塗りつぶし領域内に存在します。偶数の場合、点は塗りつぶし領域の外側にあります。D2D1_FILL_MODE_WINDING
点がパスの塗りつぶし領域に含まれているかどうかを判断するには、その点から任意の方向に無限にレイを描画してから、図形のセグメントがレイと交差する場所を調査します。カウントは 0 から始まる場合、レイの観点から見て左右がわかる限り、セグメントが左から右にレイと交差するたびに 1 が加算され、パス セグメントが右から左にレイと交差するたびに 1 が減算されます。交差をカウントした後、結果がゼロの場合、点はパスの外側にあります。それ以外の場合、点はパスの内部にあります。
解説
CreateGeometryGroup メソッドを使用して ID2D1GeometryGroup を作成する場合、または ID2D1SimplifiedGeometrySink::SetFillMode メソッドを使用して ID2D1SimplifiedGeometrySink の塗りつぶしモードを変更する場合は、D2D1_FILL_MODE 列挙型を使用します。
Direct2D では、この列挙型で指定された 2 つの塗りつぶしモード D2D1_FILL_MODE_ALTERNATE (交互) または D2D1_FILL_MODE_WINDING (全域) のいずれかを使用して、パスの内部を塗りつぶします。閉じられた図形の内部を塗りつぶす方法はモードによって決まるため、すべての図形は、塗りつぶされるときに閉じていると見なされます。図形のセグメントで間隔が空いている場合は、架空の線を描画して図形を閉じます。
全域塗りつぶしモードと交互塗りつぶしモードの違いを確認するために、中心が同じで半径の異なる 4 つの円があるとします。最初の円の半径は 25、2 番目は 50、3 番目は 75、4 番目は 100 です。
次の図は、交互塗りつぶしモードを使用して塗りつぶされた図形を示しています。中心と 3 番目のリングが塗りつぶされていないことを確認します。これは、この 2 つのリングの両方に存在する点から描画されたレイが、偶数のセグメントを通過するためです。
次の図では、このプロセスについて説明します。
次の図は、全域塗りつぶしモードが指定されている場合に同じ図形がどのように塗りつぶされるかを示しています。
すべてのリングが塗りつぶされていることを確認します。これは、すべてのセグメントが同じ方向に進むためです。その結果、任意の点から描画されたレイは 1 つ以上のセグメントと交差するため、交差の合計は 0 になりません。
次の図では、このプロセスについて説明します。赤い矢印はセグメントが描画される方向を表し、黒い矢印は最も内側のリングに存在する点から進む任意のレイを表します。値は 0 から始まり、レイが交差する各セグメントでは、時計回りに交差するたびに 1 が加算されます。カウントが 0 と一致しないため、この図では、すべての点が塗りつぶし領域に存在します。
例
次のコード例では、前の図で使用されたジオメトリ グループを作成します。まず、コードでは、ジオメトリ オブジェクトの配列を宣言します。これらのオブジェクトは 4 つの同心円で、半径はそれぞれ 25、50、75、および 100 です。次に、ID2D1Factory オブジェクトで CreateGeometryGroup を呼び出し、D2D1_FILL_MODE_ALTERNATE、ジオメトリ グループに追加するジオメトリ オブジェクトの配列、およびこの配列内の要素数を渡します。
HRESULT DemoApp::CreateGeometryResources()
{
HRESULT hr;
const D2D1_ELLIPSE ellipse1 = D2D1::Ellipse(
D2D1::Point2F(105.0f, 105.0f),
25.0f,
25.0f
);
hr = m_pD2DFactory->CreateEllipseGeometry(
ellipse1,
&m_pEllipseGeometry1
);
if (SUCCEEDED(hr))
{
const D2D1_ELLIPSE ellipse2 = D2D1::Ellipse(
D2D1::Point2F(105.0f, 105.0f),
50.0f,
50.0f
);
hr = m_pD2DFactory->CreateEllipseGeometry(
ellipse2,
&m_pEllipseGeometry2
);
}
if (SUCCEEDED(hr))
{
const D2D1_ELLIPSE ellipse3 = D2D1::Ellipse(
D2D1::Point2F(105.0f, 105.0f),
75.0f,
75.0f
);
hr = m_pD2DFactory->CreateEllipseGeometry(
ellipse3,
&m_pEllipseGeometry3
);
}
if (SUCCEEDED(hr))
{
const D2D1_ELLIPSE ellipse4 = D2D1::Ellipse(
D2D1::Point2F(105.0f, 105.0f),
100.0f,
100.0f
);
hr = m_pD2DFactory->CreateEllipseGeometry(
ellipse4,
&m_pEllipseGeometry4
);
}
if (SUCCEEDED(hr))
{
ID2D1Geometry *ppGeometries[] =
{
m_pEllipseGeometry1,
m_pEllipseGeometry2,
m_pEllipseGeometry3,
m_pEllipseGeometry4
};
hr = m_pD2DFactory->CreateGeometryGroup(
D2D1_FILL_MODE_ALTERNATE,
ppGeometries,
ARRAYSIZE(ppGeometries),
&m_pGeoGroup_AlternateFill
);
if (SUCCEEDED(hr))
{
hr = m_pD2DFactory->CreateGeometryGroup(
D2D1_FILL_MODE_WINDING,
ppGeometries,
ARRAYSIZE(ppGeometries),
&m_pGeoGroup_WindingFill
);
}
}
return hr;
}
完全なコードについては、「ジオメトリ グループの例」を参照してください。
要件
クライアントの最小要件 |
Windows 7, Windows Vista SP2 および Windows Vista 用のプラットフォーム更新プログラム |
サーバーの最小要件 |
Windows Server 2008 R2, Windows Server 2008 SP2 および Windows Server 2008 用のプラットフォーム更新プログラム |
ヘッダー |
D2d1.h |