Überschwemmung füllt sich

Überschwemmung füllt sich, auch genannt Samen füllen sich, ist ein Algorithmus, der das Gebiet bestimmt, das mit einem gegebenen Knoten in einer mehrdimensionalen Reihe verbunden ist. Es wird im "Eimer" verwendet füllen Werkzeug von Farbe-Programmen, um zu bestimmen, welche Teile eines bitmap, mit der Farbe, und in Spielen zu füllen, die Gehen und Minensuchboot, um zu bestimmen, welche Stücke geklärt werden. Wenn angewandt, an ein Image, um ein besonderes begrenztes Gebiet mit der Farbe zu füllen, ist es, auch bekannt als Grenze füllen sich.

Der Algorithmus

Die Überschwemmung füllt sich Algorithmus nimmt drei Rahmen: ein Anfang-Knoten, eine Zielfarbe und eine Ersatzfarbe. Der Algorithmus sucht nach allen Knoten in der Reihe, die mit dem Anfang-Knoten durch einen Pfad der Zielfarbe verbunden werden, und sie zur Ersatzfarbe ändert. Es gibt viele Wege, auf die sich die Überschwemmung - füllen, kann Algorithmus strukturiert werden, aber sie alle machen von einer Warteschlange Gebrauch oder schobern Datenstruktur ausführlich oder implizit auf. Eine implizit Stapel-basierte (rekursive) Überschwemmung - füllt sich Durchführung (für eine zweidimensionale Reihe) geht wie folgt:

Überschwemmung - füllt sich (Knoten, zielfarbig, ersatzfarbig):

1. Wenn die Farbe des Knotens dem zielfarbigen nicht gleich ist, zurückkehren.

2. Stellen Sie die Farbe des Knotens zum ersatzfarbigen ein.

3. Leisten Sie Überschwemmung - füllen sich (ein Schritt nach Westen des Knotens, zielfarbig, ersatzfarbig).

Leisten Sie Überschwemmung - füllen sich (ein Schritt nach Osten des Knotens, zielfarbig, ersatzfarbig).

Leisten Sie Überschwemmung - füllen sich (ein Schritt nach Norden des Knotens, zielfarbig, ersatzfarbig).

Leisten Sie Überschwemmung - füllen sich (ein Schritt nach Süden des Knotens, zielfarbig, ersatzfarbig).

4. Zurückkehren.

Alternative Durchführungen

Obwohl leicht, um zu verstehen, ist die Durchführung des Algorithmus, der oben verwendet ist, auf Sprachen und Umgebungen unpraktisch, wo Stapel-Raum (z.B Java applets) streng beschränkt wird.

Eine ausführlich Warteschlange-basierte Durchführung wird im Pseudocode unten gezeigt. Es ist der einfachen rekursiven Lösung ähnlich, außer dass, anstatt rekursive Anrufe zu machen, es die Knoten in eine LIFO Warteschlange stößt — als ein Stapel — für den Verbrauch handelnd:

Überschwemmung - füllt sich (Knoten, zielfarbig, ersatzfarbig):

1. Satz Q zur leeren Warteschlange.

2. Fügen Sie Knoten zum Ende von Q hinzu.

4. Während Q nicht leer ist:

5. Satz n gleich dem letzten Element von Q.

7. Entfernen Sie letztes Element von Q.

8. Wenn die Farbe von n dem zielfarbigen gleich ist:

9. Stellen Sie die Farbe von n zum ersatzfarbigen ein.

10. Fügen Sie Westknoten zum Ende von Q hinzu.

11. Fügen Sie Ostknoten zum Ende von Q hinzu.

12. Fügen Sie Nordknoten zum Ende von Q hinzu.

13. Fügen Sie Südknoten zum Ende von Q hinzu.

14. Zurückkehren.

Praktischste Durchführungen verwenden eine Schleife für die West- und Ostrichtungen als eine Optimierung, um die Gemeinkosten des Stapels oder Warteschlange-Managements zu vermeiden:

Überschwemmung - füllt sich (Knoten, zielfarbig, ersatzfarbig): 1. Satz Q zur leeren Warteschlange.

2. Wenn die Farbe des Knotens dem zielfarbigen nicht gleich ist, zurückkehren.

3. Fügen Sie Knoten zu Q hinzu.

4. Für jedes Element n Q:

5. Wenn die Farbe von n dem zielfarbigen gleich ist:

6. Satz w und e gleich n.

7. Bewegen Sie w nach Westen, bis die Farbe des Knotens nach Westen von w nicht mehr zielfarbig zusammenpasst.

8. Bewegen Sie e nach Osten, bis die Farbe des Knotens nach Osten von e nicht mehr zielfarbig zusammenpasst.

9. Stellen Sie die Farbe von Knoten zwischen w und e zum ersatzfarbigen ein.

10. Für jeden Knoten n zwischen w und e:

11. Wenn die Farbe des Knotens nach Norden von n zielfarbig ist, fügen Sie diesen Knoten zu Q hinzu.

12. Wenn die Farbe des Knotens nach Süden von n zielfarbig ist, fügen Sie diesen Knoten zu Q hinzu.

13. Setzen Sie fort sich zu schlingen, bis Q erschöpft wird.

14. Zurückkehren.

Die Anpassung des Algorithmus, um eine zusätzliche Reihe zu verwenden, um die Gestalt des Gebiets zu versorgen, erlaubt Generalisation, "krause" Überschwemmungsfüllung zu bedecken, wo sich ein Element durch bis zu einer angegebenen Schwelle vom Quellsymbol unterscheiden kann. Mit dieser zusätzlichen Reihe weil erlaubt ein Alpha-Kanal den Rändern des gefüllten Gebiets, etwas glatt mit nicht - gefülltes Gebiet zu verschmelzen.

Feste Speichermethode (recht füllen Methode)

Eine Methode besteht, der im Wesentlichen kein Gedächtnis für vierverbundene Gebiete verwendet, indem er vorgegeben wird, ein Maler zu sein, der versucht, das Gebiet zu malen, ohne sich in eine Ecke zu manövrieren. Das ist auch eine Methode, für Irrgärten zu lösen. Die vier Pixel, die die primäre Grenze machen, werden untersucht, um zu sehen, welche Handlung genommen werden sollte. Der Maler konnte sich in einer von mehreren Bedingungen finden:

  1. Alle vier Grenzpixel werden gefüllt.
  2. Drei der Grenzpixel werden gefüllt.
  3. Zwei der Grenzpixel werden gefüllt.
  4. Ein Grenzpixel wird gefüllt.
  5. Nullgrenzpixel werden gefüllt.

Wo einem Pfad oder Grenze gefolgt werden soll, wird die rechte Regel verwendet. Der Maler folgt dem Gebiet, indem er ihr rechtes auf der Wand (die Grenze des Gebiets) legt und um den Rand des Gebiets fortschreitet, ohne ihre Hand zu entfernen.

Für den Fall #1 (füllen) die Maler-Farben das Pixel, auf das der Maler Stehen ist und den Algorithmus aufhört.

Für den Fall #2 besteht ein Pfad, der aus dem Gebiet führt. Malen Sie das Pixel der Maler ist Stehen auf und Bewegung in der Richtung auf den offenen Pfad.

Für den Fall #3 definieren die zwei Grenzpixel einen Pfad, der, wenn wir das aktuelle Pixel gemalt haben, uns davon blockieren kann, jemals auf die andere Seite des Pfads zurückzukommen. Wir brauchen ein "Zeichen", um zu definieren, wo wir sind, und welche Richtung wir anführen, um zu sehen, ob wir jemals zu genau demselben Pixel zurückkommen. Wenn wir bereits solch ein "Zeichen" geschaffen haben, dann bewahren wir unser vorheriges Zeichen und bewegen uns zum folgenden Pixel im Anschluss an die rechte Regel.

Ein Zeichen wird für die erste 2-Pixel-Grenze verwendet, auf die gestoßen wird, um sich zu erinnern, wo der Durchgang angefangen hat und darin, welche Richtung der Maler bewegte. Wenn auf das Zeichen wieder gestoßen wird und der Maler in derselben Richtung reist, dann weiß der Maler, dass es sicher ist, das Quadrat mit dem Zeichen zu malen und in derselben Richtung weiterzugehen. Das ist, weil (durch einen unbekannten Pfad) die Pixel auf der anderen Seite des Zeichens erreicht und in der Zukunft gemalt werden können. Das Zeichen wird für den zukünftigen Gebrauch entfernt.

Wenn der Maler auf das Zeichen stößt, aber in eine verschiedene Richtung hineingeht, dann ist eine Art Schleife vorgekommen, der den Maler veranlasst hat, zum Zeichen zurückzukehren. Diese Schleife muss beseitigt werden. Das Zeichen wird aufgenommen, und der Maler geht dann in der Richtung angezeigt vorher durch das Zeichen mit einer linken Regel für die Grenze (ähnlich der rechten Regel, aber mit der linken Hand des Malers) weiter. Das geht weiter, bis eine Kreuzung (mit drei oder mehr offenen Grenzpixeln) gefunden wird. Noch mit der linken Regel sucht der Maler jetzt nach einem einfachen Durchgang (gemacht durch zwei Grenzpixel). Nach der Entdeckung dieses Zwei-Pixel-Grenzpfads wird dieses Pixel gemalt. Das bricht die Schleife und erlaubt dem Algorithmus weiterzugehen.

Für den Fall #4 müssen wir die entgegengesetzten 8-verbundenen Ecken überprüfen, um zu sehen, ob sie gefüllt werden oder nicht. Wenn entweder oder beide gefüllt werden, dann schafft das eine Vielpfad-Kreuzung und kann nicht gefüllt werden. Wenn sowohl leer sind, dann kann das aktuelle Pixel gemalt werden als auch der Maler kann sich im Anschluss an die rechte Regel bewegen.

Der Algorithmus tauscht Zeit gegen das Gedächtnis. Für einfache Gestalten ist es sehr effizient. Jedoch, wenn die Gestalt mit vielen Eigenschaften kompliziert ist, gibt der Algorithmus eine große Zeitdauer aus, die die Ränder des Gebiets verfolgt, das versucht sicherzustellen, dass alle gemalt werden können.

Dieser Algorithmus war zuerst gewerblich 1981 auf einem Vicom von Vicom Systems, Inc verfertigten Bildverarbeitungssystem verfügbar. Die klassische rekursive Überschwemmung füllt sich Algorithmus war auf diesem System ebenso verfügbar.

Pseudocode

Das ist eine Pseudocodedurchführung einer optimalen Überschwemmung des festen Gedächtnisses füllen in strukturiertem Englisch geschriebenen Algorithmus:

Die Variablen:

Köter, Zeichen und mark2 hält jeder entweder Pixel-Koordinaten oder einen ungültigen Wert

ZEICHEN: Wenn Zeichen auf die Null gesetzt wird, löschen Sie seinen vorherigen Koordinatenwert nicht.

Halten Sie jene Koordinaten verfügbar, um nötigenfalls zurückgerufen zu werden.

Köter-dir, Zeichen-dir und mark2-dir hält jeder eine Richtung (verlassen, Recht, oder unten)

Rückzug und findloop jeder hält boolean, schätzen

Zählung ist eine ganze Zahl

Der Algorithmus:

(ZEICHEN: Alle Richtungen (ist Vorderseite zurück, Recht abgereist), sind hinsichtlich des Köters-dir)

Satz-Köter zum Startpixel

Satz-Köter-dir zur Verzug-Richtung

klares Zeichen und mark2 (schätzt Satz zur Null)

Satz-Rückzug und findloop zu falschem

während Vorderpixel leerer ist

kommen Sie voran

enden Sie während

springen Sie, um ANZUFANGEN

HAUPTSCHLEIFE:

kommen Sie voran

wenn richtiges Pixel leerer ist

wenn Rückzug wahr ist und findloop falsch ist und entweder Vorderpixel oder nach links Pixel leerer sind

Satz findloop zu wahrem

enden Sie wenn

biegen Sie nach rechts ab

FARBE:

kommen Sie voran

enden Sie wenn

ANFANG:

die Satz-Zählung zur Zahl nichtdiagonal angrenzender Pixel hat sich (Vorderseite/Rücken/verlassen/Recht NUR) gefüllt

wenn Zählung nicht 4 ist

tun Sie

biegen Sie nach rechts ab

während Vorderpixel leerer ist

tun Sie

biegen Sie nach links

während Vorderpixel gefüllt wird

enden Sie wenn

schalten Sie um zählen auf

Fall 1

wenn Rückzug wahrer ist

Satz findloop zu wahrem

sonst, wenn findloop wahrer ist

wenn Zeichen ungültiger ist

stellen Sie Zeichen wieder her

enden Sie wenn

sonst, wenn Vorder-linkes Pixel und linkes Pixel des Zurück-beide leerer sind

klares Zeichen

biegen Sie nach links

füllen Sie Köter

springen Sie, um ZU MALEN

enden Sie wenn

Endfall

Fall 2

wenn Zurückpixel gefüllt wird

wenn Vorder-linkes Pixel nicht gefüllt wird

klares Zeichen

drehen Sie um

füllen Sie Köter

springen Sie, um ZU MALEN

enden Sie wenn

sonst, wenn Zeichen nicht gesetzt wird

Satz-Zeichen zum Köter

Satz-Zeichen-dir zum Köter-dir

klarer mark2

Satz findloop und Rückzug zu falschem

sonst

wenn mark2 nicht gesetzt wird

wenn Köter am Zeichen ist

wenn Köter-dir dasselbe als Zeichen-dir ist

klares Zeichen

drehen Sie um

füllen Sie Köter

springen Sie, um ZU MALEN

sonst

Satz-Rückzug zu wahrem

Satz findloop zu falschem

Satz-Köter-dir, um zu kennzeichnen-dir

enden Sie wenn

sonst, wenn findloop wahrer ist

Satz mark2 zum Köter

Satz mark2-dir zum Köter-dir

enden Sie wenn

sonst

wenn Köter am Zeichen ist

Satz-Köter zu mark2

Satz-Köter-dir zu mark2-dir

klares Zeichen und mark2

Satz-Rückzug zu falschem

drehen Sie um

füllen Sie Köter

springen Sie, um ZU MALEN

sonst, wenn Köter an mark2

Satz-Zeichen zum Köter

Satz-Köter-dir und Zeichen-dir zu mark2-dir

klarer mark2

Ende

enden Sie wenn enden Sie wenn Endfall

Fall 3

klares Zeichen

biegen Sie nach links

füllen Sie Köter

springen Sie, um ZU MALEN

Endfall

Fall 4

füllen Sie Köter

getaner

Endfall

enden Sie schalten

beenden Sie HAUPTSCHLEIFE

Scanline füllen sich

Der Algorithmus kann durch die Füllung von Linien beschleunigt werden. Anstatt jedes potenzielle zukünftige Pixel zu stoßen, koordinieren auf dem Stapel, es untersucht die Nachbarlinien (vorherig und folgend), um angrenzende Segmente zu finden, die ein zukünftiger Pass ausgefüllt werden können; die Koordinaten (entweder der Anfang oder das Ende) des Liniensegmentes werden auf dem Stapel gestoßen. In den meisten Fällen ist dieser scanline Algorithmus mindestens eine Größenordnung schneller als die pro Pixel.

Leistungsfähigkeit: Jedes Pixel wird einmal überprüft.

Vektor-Durchführungen

Die Version 0.46 von Inkscape schließt einen Eimer ein füllen Werkzeug, Produktion gebend, die gewöhnlichen bitmap Operationen und tatsächlich mit ein ähnlich ist: Die Leinwand wird gemacht, eine Überschwemmung füllen sich Operation wird auf dem ausgewählten Gebiet durchgeführt, und das Ergebnis wird dann zurück zu einem Pfad verfolgt. Es verwendet das Konzept einer Grenzbedingung.

In großem Umfang Verhalten

Die primäre Technik, die verwendet ist, um eine Überschwemmung zu kontrollieren, füllt sich wird entweder datenzentrisch oder mit dem Prozess zentrisch sein. Eine datenzentrische Annäherung kann entweder einen Stapel oder eine Warteschlange verwenden, um Samen-Pixel nachzugehen, die überprüft werden müssen. Ein mit dem Prozess zentrischer Algorithmus muss einen Stapel notwendigerweise verwenden.

Ein 4-wegiger floodfill Algorithmus, der die Angrenzen-Technik und eine Warteschlange als sein Samen-Pixel-Laden verwendet, trägt eine in der Form von der Pastille Erweiterung füllen sich.

Leistungsfähigkeit: 4 Pixel haben für jedes gefüllte Pixel überprüft (8 für einen 8-wegigen füllen sich).

Ein 4-wegiger floodfill Algorithmus, die die Angrenzen-Technik und einen Stapel als sein Samen-Pixel-Laden verwenden, trägt ein geradliniger füllen sich mit "Lücken geschlossen später" Verhalten. Diese Annäherung kann besonders in älteren 8-Bit-Computerspielen gesehen werden.

Leistungsfähigkeit: 4 Pixel haben für jedes gefüllte Pixel überprüft (8 für einen 8-wegigen füllen sich).

Siehe auch

Links


Felderweiterung / Francis von Assisi
Impressum & Datenschutz