Freigeben über


Wicklungsmodi

Browse sample. Beispiel durchsuchen

.NET Multi-Platform App UI(.NET MAUI)-Grafiken stellen eine WindingMode-Enumeration bereit, mit der Sie den Füllalgorithmus für die FillPath-Methode angeben können. Konturen in einem Pfad können überlappen, und alle eingeschlossenen Bereiche können gefüllt werden, was Sie aber ggf. nicht möchten. Weitere Informationen zu Pfaden finden Sie unter Zeichnen eines Pfads.

Die WindingMode-Enumeration definiert NonZero- und EvenOdd-Member. Jeder Member steht für einen anderen Algorithmus, um zu bestimmen, ob sich ein Punkt im Füllbereich eines eingeschlossenen Bereichs befindet.

Hinweis

Die ClipPath-Methode verfügt über eine Überladungsfunktion, mit der ein WindingMode-Argument angegeben werden kann. Standardmäßig ist dieses Argument auf WindingMode.NonZero festgelegt.

NonZero

Der NonZero-Wicklungsmodus zeichnet einen hypothetischen Strahl vom Punkt bis zur Unendlichkeit in beliebiger Richtung und untersucht dann die Stellen, an denen sich Pfadkontur und Strahl kreuzen. Die Zählung beginnt bei Null. Sie erhöht sich, wenn eine Kontur den Strahl von links nach rechts kreuzt, und verringert sich, wenn eine Kontur den Strahl von rechts nach links kreuzt. Kreuzen sich Kontur und Strahl an keiner Stelle, wird der Bereich nicht gefüllt. Andernfalls wird der Bereich gefüllt.

Im folgenden Beispiel wird ein fünfzackiger Stern mit dem NonZero-Wicklungsmodus gefüllt:

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

In diesem Beispiel wird der Pfad zweimal gezeichnet. Die FillPath-Methode wird verwendet, um den Pfad mit der Farbe Blau auszufüllen, während die DrawPath-Methode den Pfad mit einem roten Strich umrandet. Die verwendete FillPath-Überladung ignoriert das WindingMode-Argument und nutzt stattdessen automatisch den NonZero-Wicklungsmodus. Dadurch werden alle eingeschlossenen Bereiche des Pfads gefüllt:

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

Hinweis

Bei vielen Pfaden füllt der NonZero-Windungsmodus oft alle eingeschlossenen Bereiche eines Pfads.

EvenOdd

Der EvenOdd-Wicklungsmodus zeichnet einen hypothetischen Strahl vom Punkt bis zur Unendlichkeit in beliebiger Richtung und zählt, wie viele Pfadkonturen den Strahl kreuzen. Wenn diese Zahl ungerade ist, wird der Bereich gefüllt. Andernfalls wird der Bereich nicht gefüllt.

Im folgenden Beispiel wird ein fünfzackiger Stern mit dem EvenOdd-Wicklungsmodus gefüllt:

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

In diesem Beispiel wird der Pfad zweimal gezeichnet. Die FillPath-Methode wird verwendet, um den Pfad mit der Farbe Blau auszufüllen, während die DrawPath-Methode den Pfad mit einem roten Strich umrandet. Die verwendete FillPath-Überladung legt fest, dass der EvenOdd-Wicklungsmodus verwendet wird. Bei diesem Modus wird die Mitte des Sterns nicht ausgefüllt:

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