Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Flood Fill problem

[es] :: .NET :: Flood Fill problem

[ Pregleda: 1997 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

cbb
Marko Kovacevic
Beograd

Član broj: 156292
Poruke: 34
*.dip.t-dialin.net.



Profil

icon Flood Fill problem22.12.2007. u 03:09 - pre 198 meseci
Zdravo,

Pisem Flood Fill 4 funkciju koja koristi Queue objekat za uskladistavanje pixela.
Problem je u tome sto kada se popunjava povrsina veca od ca. 80x80 pixela, ostanem bez memorije(trash?).
Sa manjim povrsinama radi bez problema.
Takodje, pokusao sam ranije da koristim rekurziju funkcije, ali desi se stack overflow iz razumljivih razloga.

Kod funkcije:
Code:

        protected void FloodFill(Bitmap b,int x, int y, System.Drawing.Color oldC, System.Drawing.Color newC)
        {
//pravljenj praznog Queue-a, provera izabranog pocetnog pixela i dodavanje istog u Queue

            Queue fQ= new Queue();
            if (b.GetPixel(x,y)!= oldC) return;
            fQ.Enqueue(new Point(x,y));
            
            while (fQ.Count>0)
            {
                Point pt= (Point)fQ.Dequeue();
                b.SetPixel(pt.X,pt.Y,newC);

                if(pt.X+1<b.Width && b.GetPixel(pt.X+1,pt.Y)== oldC) fQ.Enqueue(new Point(pt.X+1,pt.Y));
                if(pt.X-1>=0 && b.GetPixel(pt.X-1,pt.Y)== oldC) fQ.Enqueue(new Point(pt.X-1,pt.Y));
                if(pt.Y+1<b.Height && b.GetPixel(pt.X,pt.Y+1)== oldC) fQ.Enqueue(new Point(pt.X,pt.Y+1));
                if(pt.Y-1>=0 && b.GetPixel(pt.X,pt.Y-1)== oldC) fQ.Enqueue(new Point(pt.X,pt.Y-1));
            }
            fQ.Clear();
        }


A evo i poziva funkcije:
Code:

                Color oldC= slika.GetPixel(e.X,e.Y);
                FloodFill(slika,e.X,e.Y,oldC,Color.Black);
                Graphics g = CreateGraphics(); 
                g.DrawImage(slika,0,0,slika.Width,slika.Height);
                g.Dispose();



[Ovu poruku je menjao cbb dana 22.12.2007. u 04:23 GMT+1]
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Flood Fill problem22.12.2007. u 09:10 - pre 198 meseci
Ok, promeni algoritam malo. Umesto sto tacku stavis u queue pa je posle ofarbas kad dodje na red, ofarba je odmah i ubaci je u queue kao lokaciju za dalju analizu, dakle:

Code:

    while (fQ.Count>0)
    {
        Point pt= (Point)fQ.Dequeue();

        if(pt.X+1<b.Width && b.GetPixel(pt.X+1,pt.Y)== oldC) 
        {
            b.SetPixel(pt.X+1,pt.Y,newC);
            fQ.Enqueue(new Point(pt.X+1,pt.Y));
        }


        // sad i u ostala tri smera
    }


Ovako kako radis dosta tacaka ce biti ubaceno u Queue dva ili cak tri puta. Ali svejedno, ne bi trebalo da dobijas outofmemory, zivotni vek tvojih point objekata nije dug i na povrsini 80x80 cak iako svaka tacka bude dva puta queue-ovana nece biti vise od 12800 instanci. PRobacu sutra ovaj tvoj algoritam pa cu ti reci sta sam otkrio, okaci neke test bitmape ako ti nije tesko.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

cbb
Marko Kovacevic
Beograd

Član broj: 156292
Poruke: 34
*.dip.t-dialin.net.



Profil

icon Re: Flood Fill problem22.12.2007. u 22:43 - pre 198 meseci
Kao sat...

Hvala. Nikada se ne bih setio.
 
Odgovor na temu

[es] :: .NET :: Flood Fill problem

[ Pregleda: 1997 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.