Sdílet prostřednictvím


Režimy vinutí

Browse sample. Procházení ukázky

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.NonZerohodnotu .

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:

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

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:

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