[Delphi] Floodfill

Pagina: 1
Acties:

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Stel, ik heb op mijn canvas een vormpje getekend van zeg, een zee-ster. Nou wil ik het zo maken dat als ik in dit vormpje rechtsklik, dat het vormpje gefilld wordt. Dan kan ik de procedure FloodFill gebruiken. Maar ik wil zelf dat stukje code schrijven. Nou was ik zo ver dat ik met een recursieve procedure het geheel gevuld kreeg, maar bij grotere vormen krijg ik een stack overflow.

Ik heb de code hier niet bij de hand, maar wat ik deed was steeds bij de pixel de kleur zwart maken EN kijken of de kleur van de pixel erboven-onder-links-rechts ook zo is, en voor die pixel dezelfde procedure weer aanroepen. Werkte ook gewoon.

Maar dus met een stack overflow. Iemand een idee hoe ik dit anders kan doen?

Mother, will they like this song?


Verwijderd

- grotere stack gebruiken
- minder variabelen in je recursieve functie

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:31
Of natuurlijk een iteratieve procedure bouwen, met behulp van een queue. Dat wordt dan zoiets:
code:
1
2
3
4
5
- stop de huidige pixel in de queue
- zolang de queue niet leeg is:
   - haal de eerstvolgende pixel uit de queue
   - kleur deze pixel
   - voeg alle omliggende niet (goed) gekleurde pixels toe aan de queue

Het resultaat is hetzelfde als een recursieve floodfill, met het verschil dat je je geheugen niet op de stack alloceert maar uit de (potentieel oneindig grote) heap haalt. Je queue hoeft natuurlijk nooit meer elementen te bevatten dan er pixels in je tekening zitten.

Denk er wel aan dat pixels slechts eenmaal in de queue terecht mogen komen!

(Je kan natuurlijk elke opslagstructuur (stack, etc.) gebruiken.)