Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fülleffeckt beim füllen von Flächen erstellen! (farbauslauf) (https://www.delphipraxis.net/110415-fuelleffeckt-beim-fuellen-von-flaechen-erstellen-farbauslauf.html)

Torley 17. Mär 2008 21:22


Fülleffeckt beim füllen von Flächen erstellen! (farbauslauf)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Abend

ist nicht so wichtig kitzelt mich aber das jetzt mal heraus zu bekommen!
Man kann ja mit floodfill so einiges Füllen. mich stört daran das die fläche sofort gefüllt ist!
Ich probier seit ungefähr 1 Stunde einen Effeckt zu kreieren der dem auslaufen von farbe zeigt.

aus meinem Delphibuch von der Schule ist ein beispiel:

Delphi-Quellcode:
procedure Tform1.fuellen(x,y:integer);
begin
 image1.canvas.pixels[x,y]:= clred;
 image1.update;
 sleep(1);
 if image1.canvas.pixels[x+1,y]= clwhite then fuellen(x+1,y);   <--*
 if image1.canvas.pixels[x-1,y]= clwhite then fuellen(x-1,y);
 if image1.canvas.pixels[x,y+1]= clwhite then fuellen(x,y+1);
 if image1.canvas.pixels[x,y-1]= clwhite then fuellen(x,y-1);
end;
der code füllt aber reihenweise!

anscheinend kann die Procedure nur einmal ausgeführt werden!
das heißt das an der makierten Stelle (*) der aktuelle durchlauf gestoppt wird und der nächste gestartet wird.
D.h das erst wenn x+1 nicht weiß ist die farbe nach links ausgebreitet wird und so weiter.

kann man das nicht irgendwie unterbinden?

im anhang hab ich ein beispiel gemalt wies sein sollte!

Torley

jfheins 17. Mär 2008 21:29

Re: Fülleffeckt beim füllen von Flächen erstellen! (farbausl
 
Das geht ganz einfach, du musst statt einem Stack eine Queue nehmen ! :mrgreen:

Ok ... es ist nicht einfach (vermute ich jetzt mal ...) für dich ;)

Dein Code funktioniert mit Rekursion, d.h. es wird da:
Delphi-Quellcode:
image1.canvas.pixels[x+1,y]= clwhite then fuellen(x+1,y);
gewartet, bis das fertisch ist und dann weitergemacht. Du benutzt hier den Funktionsstack.

Ein Stack ist wie ein Loch in der Erde: Was du zuerst reintust kommt als letztes wieder raus.

Du musst dier also eine Liste programmieren, bei der du dann immer:

a) Pixel einfärben
b) Die-Umgebungs-pixel hinten zur Liste hinzufügen
c) Neuen Pixel vorne von der Liste nehemn und zurück zu a)

Vielleicht kannst du ja bereits auf eine vorhandene Queue- oder Listen-Klasse zurückgreifen ;)

Torley 17. Mär 2008 21:46

Re: Fülleffeckt beim füllen von Flächen erstellen! (farbausl
 
das heißt ich muss alle koordinaten erstmal in ein memo oder sonstiges laden und zb einem timer immer die erste nehmen lassen und diese füllen?!
beim eintragen passiert doch dann das selbe wie oben oder nicht? weil ich muss die procedure ja nochmal aufrufen und nochmal aufrufen und dann werden die halt in der reihenfolge in die liste geschrieben wie jetzt sofort gemalt oder?

torley

jfheins 17. Mär 2008 21:55

Re: Fülleffeckt beim füllen von Flächen erstellen! (farbausl
 
Nein, es passiert eben nicht das gleiche, weil du ja eine Queue statt einem Stack verwendest ;)

Hach wie erkläre ich das nun ... Stell dir einen Weg vor, der sich gabelt und dann gabeln sich die beiden aich wieder usw. bis du ... sagen wir 8 Wege hast. (Also 7 Gabelungen insg.) Wenn du wissen willst, wo die hingehen, dann kannst du entweder den ganz links bis hinten gehen. Dann eine Gabelung zurück und den anderen. Dann 2 Gabelungen zurück und da den rechten usw.
Das wäre ein Stack ;) Wenn du jedoch erstmal die beiden ersten Wege anguckst, danach die 4 Wege, die sich daran anschließen und dann die 8 am Ende, dann wäre das wie eine Queue ;) Du siehst (vielleicht) dass es ein ganz anderes Muster ergibt ;)

Sonst: http://de.wikipedia.org/wiki/Stapelspeicher und http://de.wikipedia.org/wiki/Warteschlange_(Datenstruktur) ;)

Um deine Fragen zu beantworten:
Zitat:

das heißt ich muss alle koordinaten erstmal in ein memo oder sonstiges laden und zb einem timer immer die erste nehmen lassen und diese füllen?!
So ähnlich, ja.
Zitat:

beim eintragen passiert doch dann das selbe wie oben oder nicht?
Nein, wegen der anderen Reihenfolge ;)
Zitat:

weil ich muss die procedure ja nochmal aufrufen und nochmal aufrufen und dann werden die halt in der reihenfolge in die liste geschrieben wie jetzt sofort gemalt oder?
Kommt natürlich drauf an, wie schnell du malst ;)

jfheins 18. Mär 2008 11:55

Re: Fülleffeckt beim füllen von Flächen erstellen! (farbausl
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab dir mal ein Beispielprogramm gemacht ;)

Die Listbox rechts ist der Stack/die Queue - herausgenommen wird immer oben, aber im Queue-Modus wird unten eingefügt, beimm Stack oben ;)

Das Bild ist etwas vergrößert, damit man das ganze besser sehen kann, und es ist nicht auf Performance gertrimmt, sodass du gut verfolgen kannst, was es für einen Unterschied macht ;)

In dem Editfeld kannst du das Sleep-Intervall einstellen, also 500 => 500ms Wartezeit nach jedem Schritt.

Abbrechen ist erstmal nicht drin :mrgreen:

Ich hoffe das Prog hilft dir,den Unterschid zu verstehen, und zu zeigen, dass es nicht allzu aufwändig ist, die Queue selbst zu programmieren ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz