Який найкращий алгоритм «відро заповнення»?


16

Я досить новачок в обробці зображень, і в даний час працюю над фарбою, що додає фарбу, яка буде заповнювати відро. Однак я не маю уявлення, який найкращий алгоритм для заповнення відра.

Я реалізував приклад, знайдений на цьому веб-сайті , однак він зіткнувся з нескінченними проблемами циклу, коли користувач намагався заповнити ковш області, яка вже була заповнена ковшем тим самим кольором.

Наразі я вирішую цю проблему, заповнюючи вліво, вправо, вгору та вниз; однак я зробив це так, що після заповнення пікселя зліва, він не може заповнити праворуч, що означає форми, такі як:

Приклад

не заповниться належним чином, якщо інструмент відра використовується в червоній крапці.

Тому я сподіваюся, що хтось знає алгоритм чи посилання на той, який вирішить усі ці проблеми.

Додаткова інформація: Це буде реалізовано за допомогою Javascript як інструменту фарби. Він буде використовуватися в Інтернеті, використовуючи елемент Canvas.


На основі цього вектора чи растрових зображень? Я припускаю растрове зображення, але просто переконуюсь ..
Дем'ян Брехт

1
Я думаю, ти щось неправильно реалізував. Я перекинув документ, і згідно з прикладами зображень, це має заповнювати зображення, як описано вище. Ви скопіювали і вставили його код, чи ви його переписали?
RLH

Подумайте обхід графіків.
Bwmat

@RLH: Я копіюю і вставляю його код із кількома змінами, щоб він міг працювати з моїм налаштуванням.
Іван

@Ivan: не починайте шукати нове альго до того, як ви вирішите свої "нескінченні петлі". Якщо ви навіть не зможете виправити це для існуючої реалізації, ви, безумовно, зіткнетеся з набагато більшими проблемами, коли збираєтесь переписати всю справу з нуля.
Doc Brown

Відповіді:


21

Це здається, що ви насправді шукаєте алгоритм заповнення затоплення. Ось чому ви не знайшли багато прикладів для цього. На сторінці Вікіпедії для алгоритму перелічено кілька методів заповнення повені . Я настійно рекомендую один з нерекурсивних методів "у черзі".


I highly recommend one of the non-recursive, 'queued' methods.- Чи можете ви пояснити, чому?
Ельфайер

1
@Elfayer Кожен раз, коли викликається функція (скажімо, "X ()" має виклик до "Y ()"), параметри і місце пам'яті від функції, що виходить ("X ()") зберігаються в стеці. Отже, якщо ви заповнюєте великий і складний простір, тоді буде багато рекурсивних викликів функцій. Залежно від компілятора та мови, це може призвести до переповнення стека або надмірного споживання пам'яті.
боксертен

-1

Я зараз роблю те саме. Однак, коли я зіткнувся з проблемою, яку ви вказали, я вирішив просто припинити функцію, якщо інструмент було натиснуто на область того ж кольору, яку ви намагаєтесь намалювати (це також здається поведінкою ms-paint) .

Метод у черзі повинен бути надзвичайно інтуїтивним для тих, хто має певний досвід програмування.

Якщо фарбування ділянки навколо плями такого ж кольору, як ваша фарба, викликає занепокоєння, ви можете:

  • перевірити колір тла.
  • шукайте край одноколірної плями, на яку ви натиснули.
  • черга навколишніх точок до місця.
  • продовжуйте звичайне виконання, використовуючи цю (у даному випадку) чергову білу крапку.

Якщо ви хочете, можете поглянути на мій (досить бентежний) код тут .

Це далеко не швидко, але це працює чудово ...


Чому голоси? :( Я знаю, що метод не особливо "швидкий", але він працює, а також пропонує запропоноване рішення :(
Juan Pablo Alvarez Alfaro

1
цю публікацію досить важко читати (стіна тексту). Ви б не хотіли відредагувати його в кращій формі?
гнат

2
Серйозно? Люди масово вниз голосували, бо важко було читати? Чому б не вибрати редагувати? Це не так, як зміст проблематично.
l46kok

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.