Questa è la mia implementazione in C# di un algoritmo di riempimento flood basato su stack (che ho basato sulla definizione di wikipedia). Prima mentre scrivevo, volevo solo vederlo funzionare. E lo ha fatto. Quindi, volevo sapere il numero di pixel che era in realtà riempito. Quindi nel mio codice, ho cambiato il tipo restituito in int e restituito la variabile "ctr". Ma poi ctr si è rivelato essere circa il doppio del numero effettivo di pixel pieni (ho creato una funzione separata con il solo scopo di contare quei pixel - solo per sapere per certo).Implementazione riempimento Flood
Qualcuno può chiarire come e perché la variabile "ctr" viene incrementata due volte come avrebbe dovuto?
* La classe Pixel funge solo da contenitore per i valori x, ye dei colori dei pixel dalla bitmap.
public Bitmap floodfill(Bitmap image, int x, int y, Color newColor)
{
Bitmap result = new Bitmap(image.Width, image.Height);
Stack<Pixel> pixels = new Stack<Pixel>();
Color oldColor = image.GetPixel(x, y);
int ctr = 0;
pixels.Push(new Pixel(x, y, oldColor));
while (pixels.Count > 0)
{
Pixel popped = pixels.Pop();
if (popped.color == oldColor)
{
ctr++;
result.SetPixel(popped.x, popped.y, newColor);
pixels.Push(new Pixel(popped.x - 1, popped.y, image.GetPixel(x - 1, y));
pixels.Push(new Pixel(popped.x + 1, popped.y, image.GetPixel(x + 1, y));
pixels.Push(new Pixel(popped.x, popped.y - 1, image.GetPixel(x, y - 1));
pixels.Push(new Pixel(popped.x, popped.y + 1, image.GetPixel(x, y + 1));
}
}
return result;
}
Se 'ctr' significa' contatore', non c'è niente di sbagliato nel chiamarlo 'contatore'. –