次の方法で共有


ワインディング モード

Browse sample. サンプルを参照する

.NET Multi-platform App UI (.NET MAUI) グラフィックスには、FillPath メソッドで使用する塗りつぶしアルゴリズムを指定できる WindingMode 列挙型が提供されています。 パス内の輪郭は重なり合う可能性があり、囲まれた領域は塗りつぶすことができますが、囲まれた領域をすべて塗りつぶさないほうが良い場合もあります。 パスの詳細については、「パスを描画する」をご覧ください。

WindingMode 列挙は、NonZeroEvenOdd のメンバーを定義しています。 各メンバーは、囲まれた領域の塗りつぶし領域にポイントがあるかどうかを判断するための異なるアルゴリズムを表します。

Note

ClipPath メソッドには、WindingMode 引数を指定できるオーバーロードがあります。 既定では、この引数は WindingMode.NonZero に設定されています。

0 以外

NonZero ワインディング モードでは、あるポイントから任意の方向に仮想の光線を無限に描き、パスの輪郭が光線と交差する場所を調べます。 カウントは 0 から始まり、輪郭が光線を左から右に横切るたびに増分され、輪郭が光線を右から左に横切るたびに減分されます。 交差の数が 0 の場合、領域は塗りつぶされません。 それ以外の場合は、領域が塗りつぶされます。

次の例では、NonZero ワインディング モードを使用して 5 つの角を持つ星を塗りつぶします。

float radius = 0.45f * Math.Min(dirtyRect.Width, dirtyRect.Height);

PathF path = new PathF();
path.MoveTo(dirtyRect.Center.X, dirtyRect.Center.Y - radius);

for (int i = 1; i < 5; i++)
{
    double angle = i * 4 * Math.PI / 5;
    path.LineTo(new PointF(radius * (float)Math.Sin(angle) + dirtyRect.Center.X, -radius * (float)Math.Cos(angle) + dirtyRect.Center.Y));
}
path.Close();

canvas.StrokeSize = 15;
canvas.StrokeLineJoin = LineJoin.Round;
canvas.StrokeColor = Colors.Red;
canvas.FillColor = Colors.Blue;
canvas.FillPath(path); // Overload automatically uses a NonZero winding mode
canvas.DrawPath(path);

この例では、パスが 2 回描画されます。 FillPath メソッドはパスを青色で塗りつぶし、DrawPath メソッドはパスの輪郭を赤色のストロークで描きます。 使用される FillPath オーバーロードは WindingMode 引数を省略し、代わりに自動的に NonZero ワインディング モードを使用します。 これにより、パスで囲まれたすべての領域が塗りつぶされます。

Screenshot of a five-pointed star, using the non-zero winding mode.

Note

多くのパスでは、多くの場合、NonZero ワインディング モードはパスのすべての囲まれた領域を塗りつぶします。

EvenOdd

EvenOdd ワインディング モードでは、あるポイントから任意の方向に仮想の光線を無限に描画し、光線が交差するパスの輪郭数をカウントします。 この数値が奇数の場合は、領域が塗りつぶされます。 それ以外の場合、領域は塗りつぶされません。

次の例では、EvenOdd ワインディング モードを使用して 5 つの角を持つ星を塗りつぶします。

float radius = 0.45f * Math.Min(dirtyRect.Width, dirtyRect.Height);

PathF path = new PathF();
path.MoveTo(dirtyRect.Center.X, dirtyRect.Center.Y - radius);

for (int i = 1; i < 5; i++)
{
    double angle = i * 4 * Math.PI / 5;
    path.LineTo(new PointF(radius * (float)Math.Sin(angle) + dirtyRect.Center.X, -radius * (float)Math.Cos(angle) + dirtyRect.Center.Y));
}
path.Close();

canvas.StrokeSize = 15;
canvas.StrokeLineJoin = LineJoin.Round;
canvas.StrokeColor = Colors.Red;
canvas.FillColor = Colors.Blue;
canvas.FillPath(path, WindingMode.EvenOdd);
canvas.DrawPath(path);

この例では、パスが 2 回描画されます。 FillPath メソッドはパスを青色で塗りつぶし、DrawPath メソッドはパスの輪郭を赤色のストロークで描きます。 使用される FillPath オーバーロードは、EvenOdd ワインディング モードを使用することを指定します。 このモードでは、星の中心領域が塗りつぶされません。

Screenshot of a five-pointed star, using the even-odd winding mode.