Реализация заливки

#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() функциями.