Tryby uzwojenia
Grafika interfejsu użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI) udostępnia WindingMode wyliczenie, które umożliwia określenie algorytmu wypełnienia, który ma być używany przez metodę FillPath . Kontury w ścieżce mogą nakładać się, a każdy zamknięty obszar może być wypełniony, ale nie chcesz wypełniać wszystkich zamkniętych obszarów. Aby uzyskać więcej informacji na temat ścieżek, zobacz Rysowanie ścieżki.
Wyliczenie WindingMode definiuje NonZero
elementy i EvenOdd
elementy członkowskie. Każdy element członkowski reprezentuje inny algorytm określania, czy punkt znajduje się w regionie wypełnienia otaczającego obszaru.
Uwaga
Metoda ClipPath ma przeciążenie, które umożliwia określenie argumentu WindingMode . Domyślnie ten argument ma wartość WindingMode.NonZero
.
Niezerowa
NonZero
Tryb uzwojenia rysuje hipotetyczny promień od punktu do nieskończoności w dowolnym kierunku, a następnie bada miejsca, w których kontur ścieżki przecina promienie. Liczba zaczyna się od zera i jest zwiększana za każdym razem, gdy kontur przecina promienie od lewej do prawej i dekrementowane za każdym razem, gdy kontur przecina promienie od prawej do lewej. Jeśli liczba przekroczeń wynosi zero, obszar nie jest wypełniony. W przeciwnym razie obszar jest wypełniony.
Poniższy przykład wypełnia pięcioramienną gwiazdę przy użyciu NonZero
trybu uzwojenia:
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);
W tym przykładzie ścieżka jest rysowana dwa razy. Metoda FillPath służy do wypełniania ścieżki niebieskim, podczas gdy DrawPath metoda przedstawia ścieżkę z czerwonym pociągnięciem. Przeciążenie FillPath używane pomija WindingMode argument, a zamiast tego automatycznie używa NonZero
trybu uzwojenia. Spowoduje to wypełnienie wszystkich zamkniętych obszarów ścieżki:
Uwaga
W przypadku wielu ścieżek NonZero
tryb uzwojenia często wypełnia wszystkie zamknięte obszary ścieżki.
Evenodd
EvenOdd
Tryb uzwojenia rysuje hipotetyczny promienie od punktu do nieskończoności w dowolnym kierunku i zlicza liczbę konturów ścieżek, które krzyże promienia. Jeśli ta liczba jest nieparzysta, obszar zostanie wypełniony. W przeciwnym razie obszar nie jest wypełniony.
Poniższy przykład wypełnia pięcioramienną gwiazdę przy użyciu EvenOdd
trybu uzwojenia:
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);
W tym przykładzie ścieżka jest rysowana dwa razy. Metoda FillPath służy do wypełniania ścieżki niebieskim, podczas gdy DrawPath metoda przedstawia ścieżkę z czerwonym pociągnięciem. Używane FillPath przeciążenie określa, że EvenOdd
jest używany tryb uzwojenia. Ten tryb powoduje, że środkowy obszar gwiazdy nie jest wypełniony: