Režimy vinutí
Grafika .NET Multi-Platform App UI (.NET MAUI) poskytuje WindingMode výčet, který umožňuje zadat algoritmus výplně, který se má použít metodou FillPath . Obrysy v cestě se můžou překrývat a každá uzavřená oblast může být vyplněná, ale možná nebudete chtít vyplnit všechny uzavřené oblasti. Další informace o cestách naleznete v tématu Kreslení cesty.
Výčet WindingMode definuje NonZero
a EvenOdd
členy. Každý člen představuje jiný algoritmus pro určení, zda je bod v oblasti výplně uzavřené oblasti.
Poznámka:
Metoda ClipPath má přetížení, které umožňuje WindingMode zadat argument. Ve výchozím nastavení je tento argument nastaven na WindingMode.NonZero
hodnotu .
Nenulová
Vinutí NonZero
režim nakreslí hypotetický paprsek od bodu do nekonečna v libovolném směru a pak prozkoumá místa, kde obrys cesty protíná paprsek. Počet začíná na nule a je při každém obrysu křížku paprsku zleva doprava a dekrementován pokaždé, když obrys protíná paprsek zprava doleva. Pokud je počet přechodů nulový, oblast se nevyplní. V opačném případě se oblast vyplní.
Následující příklad vyplní pěticípou hvězdu NonZero
pomocí režimu vinutí:
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);
V tomto příkladu je cesta nakreslena dvakrát. Metoda FillPath se používá k vyplnění cesty modrou barvou, zatímco DrawPath metoda nastíní cestu červeným tahem. Přetížení FillPath vynechá WindingMode argument a místo toho automaticky použije NonZero
režim vinutí. Výsledkem je vyplnění všech uzavřených oblastí cesty:
Poznámka:
U mnoha cest NonZero
režim vinutí často vyplní všechny uzavřené oblasti cesty.
EvenOdd
Režim EvenOdd
vinutí nakreslí hypotetický paprsek od bodu do nekonečna v libovolném směru a spočítá počet obrysů cesty, které paprsk protíná. Pokud je toto číslo liché, vyplní se oblast. Jinak oblast není vyplněná.
Následující příklad vyplní pěticípou hvězdu EvenOdd
pomocí režimu vinutí:
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);
V tomto příkladu je cesta nakreslena dvakrát. Metoda FillPath se používá k vyplnění cesty modrou barvou, zatímco DrawPath metoda nastíní cestu červeným tahem. Použité FillPath přetížení určuje, že EvenOdd
se používá režim vinutí. Výsledkem tohoto režimu je, že se nezaplní střed hvězdy: