Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[ALLEGRO 5] Algorytm FloodFill

Ostatnio zmodyfikowano 2016-12-12 22:11
Autor Wiadomość
LinaInverse
Temat założony przez niniejszego użytkownika
[ALLEGRO 5] Algorytm FloodFill
» 2016-12-12 19:12:37
Witam, mam problem z algorytmem typu floodfill (wypełnianie danego obszaru kolorem) w allegro 5. Naskrobałem taki oto kodzik, nie jest on za ładny ale działa (niby):


void wypelnij_pixel(ALLEGRO_BITMAP *bitmapa, int x, int y, ALLEGRO_COLOR kolor1, ALLEGRO_COLOR kolor2)
{
    ALLEGRO_COLOR kolor3 = al_get_pixel(bitmapa, x, y);

    if (kolor1.r == kolor3.r && kolor1.g == kolor3.g && kolor1.b == kolor3.b)
    {
        al_put_pixel(x, y, kolor2);
        wypelnij_pixel(bitmapa, x-1, y, kolor1, kolor2);
        wypelnij_pixel(bitmapa, x+1, y, kolor1, kolor2);
        wypelnij_pixel(bitmapa, x, y-1, kolor1, kolor2);
        wypelnij_pixel(bitmapa, x, y+1, kolor1, kolor2);
    }
}


void wypelnij_pole(ALLEGRO_BITMAP *bitmapa, int x, int y, ALLEGRO_COLOR kolor2)
{
    ALLEGRO_COLOR kolor1 = al_get_pixel(bitmapa, x, y);

 // al_lock_bitmap(bitmapa, ALLEGRO_PIXEL_FORMAT_ANY, ALLEGRO_LOCK_WRITEONLY);
    al_set_target_bitmap(bitmapa);

    if (kolor1.r != kolor2.r || kolor1.g != kolor2.g || kolor1.b != kolor2.g) wypelnij_pixel(bitmapa, x, y, kolor1, kolor2);

   // al_unlock_bitmap(bitmapa);
    al_set_target_bitmap(al_get_backbuffer(okno));
    al_set_target_backbuffer(okno);

    al_rest(0.5);
}

Przed wywołaniem funkcji wypelnij_pole zawsze zamykam bitmapę, na której wypełniam obszar za pomocą al_lock_bitmap.

Funkcja niby działa ok i ładnie wszystko koloruje na obszarach rzędu 200x100, 250x50 pikseli itp, ale gdy próbuję wypełnić jakiś większy obszar (np. 400 x 400) program się wyłącza. Macie na to jakaś radę?
P-154829
mokrowski
» 2016-12-12 22:11:16
Zmiana z rekurencji na iterację czyli derekursywacja. Przeciążasz pewnie stos wywołaniami wypelnij_pixel(...).
Można wykorzystać także kolejkę do zapamiętania elementu do wypełnienia.
P-154835
« 1 »
  Strona 1 z 1