У меня проблема с моей функцией заливки:
void floodfill(int x, int y,Pixel old, Pixel new){
Pixel current = getPixel(x,y);
if(current.r == old.r && current.g == old.g && current.b == old.b){
setPixel(x,y,new);
floodfill(x+1,y,old,new);
floodfill(x-1,y,old,new);
floodfill(x,y+1,old,new);
floodfill(x,y-1,old,new);
floodfill(x+1,y+1,old,new);
floodfill(x-1,y-1,old,new);
floodfill(x+1,y+1,old,new);
floodfill(x-1,y+1,old,new);
}
}
В структуре ‘Pixel’ у меня есть значения rgb пикселя. Я пытаюсь заполнить квадрат, и когда я подхожу к границе квадрата (цвет меняется с белого на черный, граница в точке x = 200), функция не меняется на другие пиксели, а просто бесконечно меняет значение x на 198 и 199 (не важно, значение у). Может кто-нибудь сказать мне, что я делаю не так?
Похоже, setPixel не устанавливает цвет (x, y) на «новый». Итак, происходит следующая последовательность рекурсивных вызовов:
(199, y) -> (200, y) [Это останавливается, потому что граница не имеет тот же цвет, что и старый] -> (198, y) -> (199, y) [(199, y) вызывается, потому что setPixel, вероятно, не изменил цвет (199, y)] -> …
Одна из возможных проблем заключается в том, что вы заполняете (x+1,y+1)
дважды и пропал (x+1,y-1)
:
floodfill(x+1,y,old,new);
floodfill(x-1,y,old,new);
floodfill(x,y+1,old,new);
floodfill(x,y-1,old,new);
floodfill(x+1,y+1,old,new);
floodfill(x+1,y-1,old,new); //Missing this case
floodfill(x-1,y+1,old,new);
floodfill(x-1,y-1,old,new);