ワインディング モード
.NET Multi-platform App UI (.NET MAUI) グラフィックスには、FillPath メソッドで使用する塗りつぶしアルゴリズムを指定できる WindingMode 列挙型が提供されています。 パス内の輪郭は重なり合う可能性があり、囲まれた領域は塗りつぶすことができますが、囲まれた領域をすべて塗りつぶさないほうが良い場合もあります。 パスの詳細については、「パスを描画する」をご覧ください。
WindingMode 列挙は、NonZero
と EvenOdd
のメンバーを定義しています。 各メンバーは、囲まれた領域の塗りつぶし領域にポイントがあるかどうかを判断するための異なるアルゴリズムを表します。
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
ワインディング モードを使用します。 これにより、パスで囲まれたすべての領域が塗りつぶされます。
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
ワインディング モードを使用することを指定します。 このモードでは、星の中心領域が塗りつぶされません。
.NET MAUI
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示