AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Fülleffeckt beim füllen von Flächen erstellen! (farbauslauf)
Thema durchsuchen
Ansicht
Themen-Optionen

Fülleffeckt beim füllen von Flächen erstellen! (farbauslauf)

Ein Thema von Torley · begonnen am 17. Mär 2008 · letzter Beitrag vom 18. Mär 2008
Antwort Antwort
Torley

Registriert seit: 24. Jan 2008
Ort: Freudenberg
39 Beiträge
 
Delphi 6 Professional
 
#1

Fülleffeckt beim füllen von Flächen erstellen! (farbauslauf)

  Alt 17. Mär 2008, 22:22
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
Angehängte Grafiken
Dateityp: bmp f_llen_920.bmp (287,2 KB, 25x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Fülleffeckt beim füllen von Flächen erstellen! (farbausl

  Alt 17. Mär 2008, 22:29
Das geht ganz einfach, du musst statt einem Stack eine Queue nehmen !

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

Dein Code funktioniert mit Rekursion, d.h. es wird da: 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
  Mit Zitat antworten Zitat
Torley

Registriert seit: 24. Jan 2008
Ort: Freudenberg
39 Beiträge
 
Delphi 6 Professional
 
#3

Re: Fülleffeckt beim füllen von Flächen erstellen! (farbausl

  Alt 17. Mär 2008, 22:46
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
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: Fülleffeckt beim füllen von Flächen erstellen! (farbausl

  Alt 17. Mär 2008, 22:55
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
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#5

Re: Fülleffeckt beim füllen von Flächen erstellen! (farbausl

  Alt 18. Mär 2008, 12:55
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

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
Angehängte Dateien
Dateityp: zip stackqueuetest_195.zip (287,9 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 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