Wypełnianie floodfill-em ograniczonej przestrzeni

0

Witam. Piszę funkcję, która będzie wypełniała obszar o zadanym "kolorze" innym "kolorem". Problem jak zwykle ten sam czyli funkcja nie działa ;/. Mianowicie chodzi o to, że po wykonaniu pierwszej iteracji gdzie mamy inkrementację zmiennej "i" i osiągnięciu granicy mapy "MapSize_x" funkcja się zacina. Nie wiem dlaczego.

Opis funkcji:
i- wsp. x pixela
j -wsp. y pixela
MapSize_x i MapSize_y wymiary mapy odopwiednio w kierunku x i y
MainTab[] jednowymiarowa tablica (osobny stos ze względu na rozmiary), w której zapisywana jest cała mapa
3 - w tabeli pola oznaczone tą cyfrą tworzą granicę obszaru, który ma być wypełniony
n - jest to liczba, na którą funkcja ma zmienić wszystkie liczby w ograniczonej przestrzeni jeśli te są różne od trójki.

Pozostałe zmienne przekazywane do funkcji służą mi do wyświetlania na ekranie mapy żebym mógł śledzić działanie programu.

void FloodFill( int i, int j, int MapSize_x, int MapSize_y, int MainTab[], int n, SDL_Surface* screen2, Uint32 pixel)
{
if( i>=0 && j>=0 && i<=MapSize_x && j<=MapSize_y){
  if ( MainTab[j*MapSize_x+i] != 3 ) {
   MainTab[j*MapSize_x+i]=n;


 // poniżej "odseparowny" kod wyświetlający wyniki na ekranie
/*    put_pixel32(screen2, i,j, pixel);
          apply_surface(0, 0, screen2, screen);
          if( SDL_Flip( screen ) == -1 ){}
          SDL_Delay(10);
 */


    FloodFill( i+1, j, MapSize_x, MapSize_y, MainTab, n, screen2, pixel);
    FloodFill( i-1, j, MapSize_x, MapSize_y, MainTab, n, screen2, pixel );
    FloodFill( i, j+1, MapSize_x, MapSize_y, MainTab, n, screen2, pixel );
    FloodFill( i, j-1, MapSize_x, MapSize_y, MainTab, n, screen2, pixel );
  } }else break;
}
0

Ok już wiem co było źle:

Warunek sterujący powinien wyglądać następująco:

 if ( MainTab[j*MapSize_x+i] == 0 ){
.
.
.
}

Sorry za zaśmiecanie. Można post usunąć.

0

Polecam floodfill 8-kierunkowy, i stworzenie sobie jakiejś listy elementów które już sprawdziłeś, oraz listy "do wykonania".
Nie będziesz musiał rekurencyjnie wywoływać tej funkcji i doprowadzać do ogromnego zapętlania.
I nie będziesz katował komputera ;]

0

Akuratnie w moim przypadku świetnie sprawdza się floodfill czterokierunkowy (ze względu na sposób w jaki ograniczam figury). Też myślałem żeby zrobić taką listę "do zrobienia" ale znowu obszary jakie mam do wypełnienia to niewielkie wielokąty o rozmiarach ok 30 x 30 punktów (dokładnie są to wielokąty Voronoi) dlatego tymczasowo wstrzymam się z taką listą, lenistwo.

P.S. Bardzo ciekawą masz stronkę. Też zajmowałem się grafiką przez krótki okres czasu. Tworzyłem animacje w XSI :).

1 użytkowników online, w tym zalogowanych: 0, gości: 1