To jest moja implementacja C# opartego na stosie algorytmu wypełniania powodziowego (który oparłem na definicji wikipedii). Wcześniej, podczas kodowania, chciałem tylko zobaczyć, jak działa. I tak się stało. Następnie chciałem poznać liczbę pikseli, która w rzeczywistości była wypełniona . W moim kodzie zmieniłem typ zwracany na int i zwróciłem zmienną "ctr". Ale okazało się, że ctr jest w przybliżeniu dwa razy większą od rzeczywistej liczby wypełnionych pikseli (wykonałem osobną funkcję wyłącznie w celu zliczania tych pikseli - żeby wiedzieć na pewno).Implementacja Flood Fill
Czy ktoś może dowiedzieć się, w jaki sposób i dlaczego zmienna "ctr" jest inkrementowana dwukrotnie, tak jak powinna być?
* Klasa Pixel służy tylko jako pojemnik dla wartości x, y i koloru pikseli z bitmapy.
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;
}
Jeśli 'ctr' oznacza' counter', nie ma nic złego w wywołaniu go 'counter'. –