绕组模式
.NET Multi-platform App UI (.NET MAUI) 图形提供了一个 WindingMode 枚举,使你能够指定 FillPath 方法要使用的填充算法。 路径中的轮廓可能会重叠,并且可能会填充任何封闭区域,但你可能不希望填充所有封闭区域。 有关路径的详细信息,请参阅绘制路径。
WindingMode 枚举定义 NonZero
和 EvenOdd
成员。 每个成员代表一种不同的算法,用于确定某个点是否在封闭区域的填充区域中。
注意
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
绕组模式。 这将导致填充路径的所有封闭区域:
注意
对于许多路径,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
绕组模式。 此模式导致星形的中心区域未被填充: