algorytm flood fill

0
void MyWindow::flood_fill(int x0,int y0,int zm_k,int nw_k){
   QStack<QPoint> q; // utworzenie stosu
    q.push(QPoint(x0,y0)); // odlozenie na stos punktu x0,y0
      QPoint p;


                     while (!q.isEmpty()) { // dopoki stos nie pusty
                         p = q.top();
                         q.pop(); // zdjecie ze stosu


                         x0 = p.x();
                         y0 = p.y();

                         if ((x0>=0)&&(y0>=0)&&(x0<szer)&&(y0<wys)) // jesli kliknalem w okno to zamalowanie
                         {
                         if(kolor(x0,y0) == zm_k){

                           ustaw_kolor(x0,y0,nw_k);

                           q.push(QPoint(x0 - 1, y0));
                           q.push(QPoint(x0 + 1, y0));
                           q.push(QPoint(x0, y0 - 1));
                           q.push(QPoint(x0, y0 + 1));

                         }}
                     }
                   }

Mam pytanie po co to zostalo stworzone? Dlaczego dodajemy nowe punkty do p a zdejmujemy punkty ze stosu ?

 p = q.top();
                         q.pop(); 


                         x0 = p.x();
                         y0 = p.y();
1

Zamiast pary

p = q.top();
q.pop(); 

powinno wystarczyć samo

p = q.pop(); 

QStack::pop() zwraca usuwany element (w odróżnieniu do std::stack).

Dlaczego dodajemy nowe punkty do p a zdejmujemy punkty ze stosu ?

Na początku dodajesz punkt startowy.
Potem w pętli sprawdzasz punkt zdjęty ze stosu. Jeżeli spełnia warunki (mieści się w obszarze i ma odpowiedni kolor) to zmieniasz jego kolor i wrzucasz na stos sąsiednie punkty. I tak w kółko aż stos się opróżni.
To taki prosty algorytm zapełniania obszarów wyznaczonym kolorem. https://pl.wikipedia.org/wiki/Flood_fill

0

A po co zdejmuje ten punkt ?

1

Stos to taki 'pojemnik' na jeszcze nie sprawdzone punkty.
Algorytm wyjmuje (zdejmuje) te punkty po jednym i sprawdza. Czasami dorzuca kolejne punkty.
Jeżeli w 'pojemniku' nic nie zostało to może zakończyć działanie.

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