Modos de enrolamento
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:
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: