纏繞模式
.NET 多平台應用程式 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
指定使用線圈模式。 此模式會導致星形中央區域未填滿: