Compartir vía


Modos de devanado

Browse sample.Examina la muestra

Los gráficos de .NET Multi-Platform App UI (.NET MAUI) proporcionan una enumeración WindingMode que permite especificar el algoritmo de relleno que usará el método FillPath. Los contornos de un trazado se pueden superponer y cualquier área cerrada puede rellenarse, pero puede que no quieras rellenar todas las áreas cerradas. Para más información sobre los trazados, consulta Dibujar un trazado.

La enumeración WindingMode define los miembros NonZero y EvenOdd. Cada miembro representa un algoritmo diferente para determinar si un punto está en la región de relleno de un área cerrada.

Nota:

El método ClipPath tiene una sobrecarga que permite especificar un argumento WindingMode. De forma predeterminada, este argumento está establecido en WindingMode.NonZero.

NonZero

El modo de devanado NonZero dibuja un rayo hipotético desde el punto hasta el infinito en cualquier dirección y, a continuación, examina los lugares donde un contorno de trazado cruza el rayo. El recuento comienza en cero y se incrementa cada vez que un contorno cruza el rayo de izquierda a derecha y disminuye cada vez que un contorno cruza el rayo de derecha a izquierda. Si el recuento de cruces es cero, el área no se rellena. De lo contrario, el área se rellena.

En el ejemplo siguiente se rellena una estrella de cinco puntas con el modo de devanado NonZero:

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

En este ejemplo, el trazado se dibuja dos veces. El método FillPath se usa para rellenar el trazado con azul, mientras que el método DrawPath perfila el trazado con un trazo rojo. La sobrecarga FillPath empleada omite el argumento WindingMode y, en su lugar, usa automáticamente el modo de devanado NonZero. Como resultado se rellenan todas las áreas delimitadas del trazado:

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

Nota:

Para muchos trazados, el modo de devanado NonZero a menudo llena todas las áreas cerradas de un trazado.

EvenOdd

El modo de devanado EvenOdd dibuja un rayo hipotético desde el punto hasta el infinito en cualquier dirección y cuenta el número de contornos de trazado que cruza el rayo. Si este número es impar, se rellena el área. De lo contrario, el área no se rellena.

En el ejemplo siguiente se rellena una estrella de cinco puntas con el modo de devanado EvenOdd:

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

En este ejemplo, el trazado se dibuja dos veces. El método FillPath se usa para rellenar el trazado con azul, mientras que el método DrawPath perfila el trazado con un trazo rojo. La sobrecarga de FillPath empleada especifica que se usa el modo de devanado EvenOdd. Este modo hace que el área central de la estrella no se llene:

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