algorytm flood fill
Ostatnio zmodyfikowano 2019-05-08 22:17
robertos18 Temat założony przez niniejszego użytkownika |
algorytm flood fill » 2019-05-08 20:10:29 void MyWindow::flood_fill( int x0, int y0, int zm_k, int nw_k ) { QStack < QPoint > q; q.push( QPoint( x0, y0 ) ); QPoint p; while( !q.isEmpty() ) { p = q.top(); q.pop(); x0 = p.x(); y0 = p.y(); if(( x0 >= 0 ) &&( y0 >= 0 ) &&( x0 < szer ) &&( y0 < wys ) ) { 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(); |
|
DejaVu |
» 2019-05-08 20:35:46 1. Dodajesz na stos punkt od którego chcesz zacząć zamalowywanie. 2. Chcesz zakończyć zamalowywanie, gdy na stosie nie ma więcej punktów do zamalowania. 3. Jeżeli aktualnie pobrany punkt ze stosu jest kolorem, który chcesz zamalować na nowy, to chcesz dodać do stosu wszystkie sąsiadujące punkty, że powinny być one odwiedzone w celu sprawdzenia czy należy je zamalować czy nie. |
|
robertos18 Temat założony przez niniejszego użytkownika |
» 2019-05-08 20:59:28 dziękuje za odpowiedz, rozjasniło działanie algorytmu, ale wciaż nie rozumiem po co uzywamy pop ? |
|
pekfos |
» 2019-05-08 21:25:01 A jak inaczej chcesz usunąć element ze stosu? |
|
robertos18 Temat założony przez niniejszego użytkownika |
» 2019-05-08 22:09:45 a po co zdejmuje ten punkt ? |
|
pekfos |
» 2019-05-08 22:17:19 Algorytm wykonuje się, aż stos będzie pusty, więc kiedyś przecież musi być pusty. Stos nie służy tu do testowania, czy punkt został już odwiedzony - tę rolę pełni zmiana koloru piksela. Stos trzyma informację o punktach do sprawdzenia - jeśli się wyczerpią, zadanie algorytmu jest wykonane. Ten algorytm to nic innego jak DFS, przestudiuj sobie klasykę. |
|
« 1 » |