Win32 API 日本語リファレンス
ホームGraphics.Direct2D.Common › D2D1_FILL_MODE

D2D1_FILL_MODE

列挙型
基底型i4

メンバー 2

名前10進16進説明
D2D1_FILL_MODE_ALTERNATE00x0その点から任意の方向に無限遠へ向かう光線を引き、指定された図形内でその光線が交差するパスセグメントの数を数えることで、点が塗りつぶし領域内にあるかどうかを判定します。この数が奇数であれば点は塗りつぶし領域内にあり、偶数であれば塗りつぶし領域の外側にあります。
D2D1_FILL_MODE_WINDING10x1その点から任意の方向に無限遠へ向かう光線を引き、図形のセグメントがその光線と交差する箇所を調べることで、点がパスの塗りつぶし領域内にあるかどうかを判定します。カウントを 0 から開始し、光線から見て左から右へセグメントが光線を横切るたびに 1 を加算し、右から左へパスセグメントが光線を横切るたびに 1 を減算します。交差を数えた後、結果が 0 であれば、その点はパスの外側にあります。それ以外の場合は、パスの内側にあります。

公式ドキュメント

ジオメトリまたは図形の交差する領域を組み合わせて、合成ジオメトリの領域を形成する方法を指定します。

解説(Remarks)

D2D1_FILL_MODE 列挙型は、ID2D1GeometryGroupCreateGeometryGroup メソッドで作成するとき、または ID2D1SimplifiedGeometrySink の塗りつぶしモードを ID2D1SimplifiedGeometrySink::SetFillMode メソッドで変更するときに使用します。

Direct2D は、この列挙型で指定される 2 つの塗りつぶしモード、D2D1_FILL_MODE_ALTERNATE (交互) または D2D1_FILL_MODE_WINDING (ワインディング) のいずれかを使用してパスの内部を塗りつぶします。これらのモードは閉じた図形の内部をどのように塗りつぶすかを決定するため、塗りつぶしの際にはすべての図形が閉じているものとして扱われます。図形のセグメントに隙間がある場合は、それを閉じる仮想的な線が引かれます。

ワインディング塗りつぶしモードと交互塗りつぶしモードの違いを確認するために、次の図に示すように、中心が同じで半径が異なる 4 つの円があると仮定します。1 つ目の半径は 25、2 つ目は 50、3 つ目は 75、4 つ目は 100 です。

半径の値が異なる 4 つの同心円の図 次の図は、交互塗りつぶしモードを使用して塗りつぶされた図形を示しています。中心と 3 番目のリングが塗りつぶされていないことに注目してください。これは、これら 2 つのリングのいずれかの任意の点から引いた光線が、偶数個のセグメントを通過するためです。 2 番目と 4 番目のリングが塗りつぶされた同心円の図 次の図はこの処理を説明しています。 2 番目と 3 番目のリング内の点と、各点から伸びる 2 本の任意の光線を示す同心円の図 次の図は、ワインディング塗りつぶしモードを指定した場合に同じ図形がどのように塗りつぶされるかを示しています。 すべてのリングが塗りつぶされた同心円の図 すべてのリングが塗りつぶされていることに注目してください。これは、すべてのセグメントが同じ方向に進んでいるため、任意の点から引いた光線は 1 つ以上のセグメントと交差し、交差の合計が 0 にならないためです。

次の図はこの処理を説明しています。赤い矢印はセグメントが描画される方向を表し、黒い矢印は最も内側のリング内の点から伸びる任意の光線を表します。0 から開始し、光線が交差する各セグメントについて、時計回りの交差ごとに 1 を加算します。この図ではカウントが 0 にならないため、すべての点が塗りつぶし領域内にあります。

1 番目のリング内から 4 つのリングすべてを横切る光線を示す同心円の図
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

列挙メンバーの定義。HSP タブは #define global(値は16進)。

typedef enum D2D1_FILL_MODE : int {
    D2D1_FILL_MODE_ALTERNATE = 0,
    D2D1_FILL_MODE_WINDING = 1
} D2D1_FILL_MODE;
public enum D2D1_FILL_MODE : int
{
    D2D1_FILL_MODE_ALTERNATE = 0,
    D2D1_FILL_MODE_WINDING = 1,
}
Public Enum D2D1_FILL_MODE As Integer
    D2D1_FILL_MODE_ALTERNATE = 0
    D2D1_FILL_MODE_WINDING = 1
End Enum
import enum

class D2D1_FILL_MODE(enum.IntEnum):
    D2D1_FILL_MODE_ALTERNATE = 0
    D2D1_FILL_MODE_WINDING = 1
// D2D1_FILL_MODE
pub const D2D1_FILL_MODE_ALTERNATE: i32 = 0;
pub const D2D1_FILL_MODE_WINDING: i32 = 1;
// D2D1_FILL_MODE
const (
	D2D1_FILL_MODE_ALTERNATE int32 = 0
	D2D1_FILL_MODE_WINDING int32 = 1
)
const
  D2D1_FILL_MODE_ALTERNATE = 0;
  D2D1_FILL_MODE_WINDING = 1;
// D2D1_FILL_MODE
pub const D2D1_FILL_MODE_ALTERNATE: i32 = 0;
pub const D2D1_FILL_MODE_WINDING: i32 = 1;
const
  D2D1_FILL_MODE_ALTERNATE* = 0
  D2D1_FILL_MODE_WINDING* = 1
enum D2D1_FILL_MODE : int {
    D2D1_FILL_MODE_ALTERNATE = 0,
    D2D1_FILL_MODE_WINDING = 1,
}
#define global D2D1_FILL_MODE_ALTERNATE 0x0
#define global D2D1_FILL_MODE_WINDING   0x1