Autore Topic: algoritmo Flood Fill  (Letto 855 volte)

vincenzodicicco

  • Visitatore
algoritmo Flood Fill
« il: 31 Luglio 2010, 17:51:23 CEST »
0
Salve, ho l'esigenza di implementare l'algoritmo Flodd Fill(il classico "secchiello" dei programmi di grafica) all'interno di una mia applicazione, ho pensato alla ricorsione ed ho buttato giu un po di codice:
Codice (Java): [Seleziona]
void rimozione_oggetti(Bitmap img,int x, int y){
        int add=0;
        boolean fine=true;
        boolean fine_ciclo=true;
        boolean nessun_pixel_bianco=false;
        int i=0;
        img.setPixel(x, y, Color.CYAN);
        while(fine_ciclo){
        if (img.getPixel(x + add, y + 1)==Color.WHITE){
                        giu_x[n_pixel]=((x + add));  //Giu_X è un array di interi che terrà traccia di tutte le coordinate X dei pixel bianchi sotto il pixel in questione
                        giu_y[n_pixel]=((y + 1));//Giu_Y è un array di interi che terrà traccia di tutte le coordinate Y dei pixel bianchi sotto il pixel in questione
                        n_pixel++;
                }
                if (img.getPixel((x + add) + 1, y) == Color.WHITE){
                        img.setPixel((x + add) + 1, y,Color.CYAN);
                        }else{
                        ciclo:{
                                while(fine){
                                        if (i >= giu_x.length){
                                        fine=false;
                                        nessun_pixel_bianco=true;
                                        break ciclo;
                                        }else{
                                                if(img.getPixel(giu_x[i], giu_y[i]) == Color.WHITE){
                                                        puntatore_pixel_bianco=i;
                                                        break ciclo;
                                                }else{
                                                                if ( i < puntatore_pixel_bianco){
                                                                        i=puntatore_pixel_bianco;
                                                                }
                                                        i++;
                                                        }
                                        }
                                }
                        }
                        if(nessun_pixel_bianco==false){
                                rimozione_oggetti(img,giu_x[i], giu_y[i]);
                        }else{fine_ciclo=false;}
                }
                add++;
        }
    }

Il problema è che il codice sull'emulatore funziona correttamente, sul mio nexus one, va in crash proprio su questa parte di codice, ora la mia ipotesi è che venga usata un eccessiva quantità di memoria, però non so proprio come risolvere.Un'altra cosa, se io volessi implemetare la ricorsione all'interno di un asynctask per evitare di freezzare la UI è possibile farlo?.Il codice non è per niente ottimizzato e sto uscendo pazzo. Un saluto a tutti quanti  :-)

vincenzodicicco

  • Visitatore
Re:algoritmo Flood Fill
« Risposta #1 il: 01 Agosto 2010, 03:31:30 CEST »
0
Per quanto l'algoritmo non è completo( mi ero fermato dopo aver notato che non andava sul device) mi sono accorto che se utilizzo un immagine con  pochi pixel da riempire il problema non avviene. Quindi penso di confermare che sia un problema di memoria, potreste consigliarmi qualche modo per vedere cosa accade ?se racchiudo il codice in un try con un catch con Exception non il programma genera lo stesso un errore e non riesco ad intercettare quale sia e capire cosa accade di preciso.Grazie a tutti :-)
« Ultima modifica: 01 Agosto 2010, 03:51:09 CEST da vincenzodicicco »

vincenzodicicco

  • Visitatore
Re:algoritmo Flood Fill
« Risposta #2 il: 01 Agosto 2010, 04:13:16 CEST »
0
Ok, penso di aver trovato la soluzione modificando l'algoritmo facendolo diventare da ricorsivo a iterativo pare che il problema si sia risolto, penso che quindi l'errore veniva generato da un eccessivo numero di chiamate alla stessa funzione.