Jestem całkiem nowy w przetwarzaniu obrazu i obecnie pracuję nad aplikacją podobną do farby, która będzie zawierała wypełnienie wiadra. Nie mam jednak pojęcia, jaki jest najlepszy algorytm wypełniania wiadra.
Wdrożyłem przykład, który znalazłem na tej stronie , jednak wystąpiły problemy z nieskończoną pętlą, gdy użytkownik próbował wypełnić wiadro obszarem, który został już wypełniony wiadrem tego samego koloru.
Obecnie pracuję nad tym problemem, wypełniając w lewo, w prawo, w górę, a następnie w dół; jednak zrobiłem to, aby po wypełnieniu piksela po lewej stronie nie mógł wypełnić się po prawej stronie, co oznacza, że kształty takie jak:
nie zostanie prawidłowo wypełniony, jeśli narzędzie łyżki zostanie użyte w czerwonej kropce.
Dlatego mam nadzieję, że ktoś zna algorytm lub link do takiego, który rozwiąże wszystkie te problemy.
Informacje dodatkowe: Zostanie to zaimplementowane przy użyciu Javascript jako narzędzia do malowania. Będzie on używany online z wykorzystaniem elementu Canvas.
źródło
Odpowiedzi:
Wygląda na to, że tak naprawdę szukasz algorytmu Flood Fill. Być może dlatego nie znalazłeś na to mnóstwo przykładów. Algorytm zawiera kilka metod wypełniania powodzi na stronie Wikipedii . Bardzo polecam jedną z nierekurencyjnych, „kolejkowanych” metod.
źródło
I highly recommend one of the non-recursive, 'queued' methods.
- Czy możesz wyjaśnić dlaczego?Obecnie robię to samo. Jednak kiedy natknąłem się na problem, który wskazałeś, zdecydowałem się po prostu zakończyć funkcję, jeśli narzędzie zostało kliknięte nad obszarem tego samego koloru, który próbujesz malować (wydaje się to również zachowaniem MS-paint) .
Metoda kolejkowania powinna być wyjątkowo intuicyjna dla każdego, kto ma pewne doświadczenie w programowaniu.
Jeśli malowanie obszaru otaczającego plamę tego samego koloru co twoja farba jest problemem, możesz:
Jeśli chcesz, możesz rzucić okiem na mój (dość zawstydzający) kod tutaj .
Nie jest szybki, ale działa dobrze ...
źródło