[ cbb @ 22.12.2007. 03:09 ] @
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]
[ mmix @ 22.12.2007. 09:10 ] @
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.
[ cbb @ 22.12.2007. 22:43 ] @
Kao sat...

Hvala. Nikada se ne bih setio.