Modos de enrolamento

Browse sample. Navegue pelo exemplo

Os gráficos .NET Multi-platform App UI (.NET MAUI) fornecem uma WindingMode enumeração que permite especificar o algoritmo de preenchimento a ser usado pelo FillPath método. Os contornos em um caminho podem se sobrepor e qualquer área fechada pode ser preenchida, mas talvez você não queira preencher todas as áreas fechadas. Para obter mais informações sobre caminhos, consulte Desenhar um caminho.

A WindingMode enumeração define NonZero e EvenOdd membros. Cada membro representa um algoritmo diferente para determinar se um ponto está na região de preenchimento de uma área delimitada.

Observação

O ClipPath método tem uma sobrecarga que permite que um WindingMode argumento seja especificado. Por padrão, esse argumento é definido como WindingMode.NonZero.

Zero

O NonZero modo de enrolamento desenha um raio hipotético do ponto ao infinito em qualquer direção e, em seguida, examina os lugares onde um contorno de caminho cruza o raio. A contagem começa em zero e é incrementada cada vez que um contorno cruza o raio da esquerda para a direita e decrementado cada vez que um contorno cruza o raio da direita para a esquerda. Se a contagem de cruzamentos for zero, a área não será preenchida. Caso contrário, a área é preenchida.

O exemplo a seguir preenche uma estrela de cinco pontas usando o NonZero modo de enrolamento:

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

Neste exemplo, o caminho é desenhado duas vezes. O FillPath método é usado para preencher o caminho com azul, enquanto o método descreve o caminho com um traçado DrawPath vermelho. A FillPath sobrecarga usada omite o argumento e, em vez disso, usa automaticamente o WindingMode NonZero modo de enrolamento. Isso resulta em todas as áreas fechadas do caminho sendo preenchidas:

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

Observação

Para muitos caminhos, o NonZero modo sinuoso geralmente preenche todas as áreas fechadas de um caminho.

EvenOdd

O EvenOdd modo sinuoso desenha um raio hipotético do ponto ao infinito em qualquer direção e conta o número de contornos de caminho que o raio atravessa. Se esse número for ímpar, a área será preenchida. Caso contrário, a área não será preenchida.

O exemplo a seguir preenche uma estrela de cinco pontas usando o EvenOdd modo de enrolamento:

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

Neste exemplo, o caminho é desenhado duas vezes. O FillPath método é usado para preencher o caminho com azul, enquanto o método descreve o caminho com um traçado DrawPath vermelho. A FillPath sobrecarga usada especifica que o EvenOdd modo de enrolamento é usado. Este modo faz com que a área central da estrela não seja preenchida:

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