У меня проблема с моей функцией заливки флуда:
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);
}
}
В struct 'Pixel' у меня есть значения rgb пикселя. Я пытаюсь заполнить квадрат, и когда я подхожу к границе квадрата (цвет меняется от белого к черному, граница находится в точке x = 200), функция не меняется на другие пиксели, а просто бесконечно меняет значение x на 198 и 199 (не считая значения y). Может ли кто-нибудь сказать мне, что я делаю неправильно?
Это звучит так, как 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);
new
- это зарезервированное ключевое слово в C ++, поэтому вы не должны пытаться использовать его в качестве имени переменной.new
равноold
?