绕组模式

Browse sample.浏览示例

.NET Multi-platform App UI (.NET MAUI) 图形提供了一个 WindingMode 枚举,使你能够指定 FillPath 方法要使用的填充算法。 路径中的轮廓可能会重叠,并且可能会填充任何封闭区域,但你可能不希望填充所有封闭区域。 有关路径的详细信息,请参阅绘制路径

WindingMode 枚举定义 NonZeroEvenOdd 成员。 每个成员代表一种不同的算法,用于确定某个点是否在封闭区域的填充区域中。

注意

ClipPath 方法具有允许指定 WindingMode 参数的重载。 默认情况下,此参数被设置为 WindingMode.NonZero

非零

NonZero 绕组模式在任何方向上绘制从该点到无穷远的假设射线,然后检查路径轮廓与射线交叉的位置。 计数从零开始,每次轮廓从左到右穿过射线时递增,每次轮廓从右到左穿过射线时递减。 如果交叉数为零,则不填充该区域。 否则,将填充该区域。

以下示例使用 NonZero 绕组模式填充五角星:

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);

在本示例中,路径被绘制了两次。 FillPath 方法用于以蓝色填充路径,而 DrawPath 方法则用红色描边勾勒路径。 使用的 FillPath 重载省略了 WindingMode 参数,而是自动使用 NonZero 绕组模式。 这将导致填充路径的所有封闭区域:

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

注意

对于许多路径,NonZero 绕组模式通常填充路径的所有封闭区域。

EvenOdd

EvenOdd 绕组模式在任何方向上绘制从该点到无穷远的假设射线,并计算射线穿过的路径轮廓的数量。 如果该数字是奇数,则会填充该区域。 否则,不会填充该区域。

以下示例使用 EvenOdd 绕组模式填充五角星:

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);

在本示例中,路径被绘制了两次。 FillPath 方法用于以蓝色填充路径,而 DrawPath 方法则用红色描边勾勒路径。 使用的 FillPath 重载指定使用 EvenOdd 绕组模式。 此模式导致星形的中心区域未被填充:

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