FloodfFill na stosie

0

Witam :)
Mój problem polega na tym że nie wiem dokładnie jak zrobić żeby operacja FloodFill działała mi na stosie posiadam wersje rekurencyjną i jeśli ktoś by mi podpowiedział jak zrobić z niej wersje ze stosem byłbym wdzięczymy.
Oto mój kod :

 void MyWidget::SeedFill_1(int x, int y, QRgb kolor, QRgb kolor2)
{
    if( img->pixel(x,y) != kolor)
    {
        img->setPixel(x,y,kolor);
        SeedFill_1(x,y,kolor,kolor2);
        SeedFill_1(x-1,y,kolor,kolor2);
        SeedFill_1(x+1,y,kolor,kolor2);
        SeedFill_1(x,y-1,kolor,kolor2);
        SeedFill_1(x,y+1,kolor,kolor2);
    }
}
0

Rekurencyjna już przecież działa na stosie ;P

0

Wiem. Tylko że trzeba to zrobić na własnym stosie :) Coś takiego tylko jak napisać to w qt ?

  flood_fill (x0,y0, zamieniany_kolor, nowy_kolor) { 
        Utwórz pusty stos Q;
        Odłóż na stos piksel (x0,y0);
        while (Q not empty)
        { 
          Zdejmij ze stosu ostatni piksel //załóżmy, że jest to (x,y); 
          if (kolor(x,y) == zamieniany_kolor) 
        { 
  ustaw_kolor(x,y, nowy_kolor); 
  Odłóż na stos piksel (x-1,y); 
  Odłóż na stos piksel (x+1,y);
  Odłóż na stos piksel (x,y+1); 
  Odłóż na stos piksel (x,y-1); 
         } 
    } 
Return; }
1

Nie jestem pewny czy będzie działać, ponadto bazuje na funkcjach/zmiennych, które ty podałeś (osobiście nigdy nie pracowałem z Qt).

void MyWidget::SeedFill_1(int x, int y, QRgb color, QRgb color2) 
{
  std::stack<QPoint> q;
  q.push(QPoint(x, y));

  QPoint p;
  while (!q.empty()) {
    p = q.top();
    q.pop();

    x = p.x();
    y = p.y();
    if (img->pixel(x, y) == color) {
      img->setPixel(x, y, color2);

      q.push(QPoint(x - 1, y));
      q.push(QPoint(x + 1, y));
      q.push(QPoint(x, y - 1));
      q.push(QPoint(x, y + 1));
    }
  }
}

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