Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 2 odgovora
  • 2.789 pregleda

Najnovija ↓

Flood Fill problem 22.12.2007. u 04:09 · pre 229 meseci
izmenjeno 1 put, poslednji put cbb 22.12.2007. u 04:23
  1. cbb22.12.2007. u 04:23zapis iz teksta poruke
#1
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();
Re: Flood Fill problem 22.12.2007. u 10:10 · pre 229 meseci #2
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.
Potpis
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ć
Re: Flood Fill problem 22.12.2007. u 23:43 · pre 229 meseci #3
Kao sat...

Hvala. Nikada se ne bih setio.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme