#c #2d #flood-fill
#c #2d #заполнение потоком
Вопрос:
У меня проблема с моей функцией заливки:
void floodfill(int x, int y,Pixel old, Pixel new){
Pixel current = getPixel(x,y);
if(current.r == old.r amp;amp; current.g == old.g amp;amp; 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 (не говоря уже о значении y). Может кто-нибудь сказать мне, что я делаю не так?
Комментарии:
1. Вы заполняете только в том случае, если текущий цвет равен старому цвету. Разве вы не хотите заполнять только в том случае, если текущий цвет не равен старому цвету? P.S —
new
это зарезервированное ключевое слово в C , поэтому вам не следует пытаться использовать его в качестве имени переменной.2. Что произойдет, если
new
равноold
?3. ??
new
— это ключевое слово в C ; вы не можете использовать его для имен переменных.4. Трубкозуб, квадрат внутри белый и имеет черные границы. Я установил старый цвет на белый, я хочу установить пиксель и начать рекурсию, когда текущий цвет белый. Когда я добираюсь до границы квадрата, текущий цвет меняется на черный.
Ответ №1:
Похоже, что SetPixel не устанавливает цвет (x, y) на «новый». Итак, происходит следующая последовательность рекурсивных вызовов:
(199, y) -> (200, y) [Это останавливается, потому что граница не имеет того же цвета, что и старая] -> (198, y) -> (199, y) [(199, y) вызывается, потому что SetPixel, вероятно, не изменил цвет (199, y)]->…
Ответ №2:
Одна из возможных проблем заключается в том, что вы заполняете (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);
Комментарии:
1. Спасибо, что исправили мою ошибку, но сразу после первого заполнения (x 1, y) моя программа зацикливается.
2. Вы имеете в виду, что ваша программа попадает в бесконечный цикл или что-то еще? Я предполагаю, что ваша квадратная граница имеет полный сплошной контур, включая его углы, заполненные старым цветом?
3. Да, бесконечный цикл и квадратная граница сплошные черные, а углы тоже черные (квадрат внутри белый).
4. В какой системе вы работаете?
setPixel()
Действительно ли задается цвет пикселя или существует уровень буферизации, который может мешать последующимgetPixel()
вызовам?5. Я провел быстрый тест, и с вышеупомянутыми исправлениями функции и ее изменением
new
newColor
все работает нормально (с использованием виртуального пиксельного экрана). Это означает, что вероятный виновник связан сsetPixel()/getPixel()
функциями.