Udostępnij za pośrednictwem


Tryby uzwojenia

Browse sample. Przeglądanie przykładu

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:

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

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:

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