Rozrost ziarna

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, szukaj
Recursive Flood Fill 8 (aka).gif

Flood fill to algorytm używany np. w programach graficznych do wypełniania zamkniętych obszarów bitmapy kolorem. Korzysta z kolejki lub stosu.

Algorytm potrzebuje trzech parametrów: początkową pozycję, zamieniany kolor i nowy kolor.

Algorytm rekursywny (oparty na stosie):

funkcja flood_fill (pozycja,zamieniany_kolor,nowy_kolor)
{
        jeżeli (kolor_na_pozycji(pozycja) = zamieniany_kolor)
        {
                ustaw_kolor(pozycja, nowy_kolor);
                flood_fill(lewo(pozycja),zamieniany_kolor,nowy_kolor);
                flood_fill(prawo(pozycja),zamieniany_kolor,nowy_kolor);
                flood_fill(góra(pozycja),zamieniany_kolor,nowy_kolor);
                flood_fill(dół(pozycja),zamieniany_kolor,nowy_kolor);
        }
}

W praktyce, aby zmniejszyć koszty obsługi stosu, poruszanie się od lewej do prawej realizuje się w pętli.

Widoczny po prawej stronie obraz ukazuje rzadziej używany algorytm, który "przeskakuje" przez nachylone linie o szerokości jednego piksela.

funkcja flood_fill8 (pozycja,zamieniany_kolor,nowy_kolor)
{
        jeżeli (kolor_na_pozycji(pozycja) = zamieniany_kolor)
        {
                ustaw_kolor(pozycja, nowy_kolor);
                flood_fill(góra(pozycja),zamieniany_kolor,nowy_kolor);
                flood_fill(dół(pozycja),zamieniany_kolor,nowy_kolor);
                flood_fill(lewo(pozycja),zamieniany_kolor,nowy_kolor);
                flood_fill(prawo(pozycja),zamieniany_kolor,nowy_kolor);
                flood_fill(lewo_góra(pozycja),zamieniany_kolor,nowy_kolor);
                flood_fill(lewo_dół(pozycja),zamieniany_kolor,nowy_kolor);
                flood_fill(prawo_góra(pozycja),zamieniany_kolor,nowy_kolor);
                flood_fill(prawo_dół(pozycja),zamieniany_kolor,nowy_kolor);
        }
}

Pokazane algorytmy w praktyce nie są używane, gdyż bardzo szybko przepełniają stos oraz wielokrotnie sprawdzają te same piksele.

Osobiste
Przestrzenie nazw

Warianty
Działania
Nawigacja
Dla czytelników
Dla wikipedystów
Narzędzia
Drukuj lub eksportuj
W innych językach