[Denkhilfe] Eimer-/Füll-Funktion bei Paintprogrammen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

buja

Betreff: [Denkhilfe] Eimer-/Füll-Funktion bei Paintprogrammen

BeitragMi, Mai 21, 2008 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin mir schon seit tagen den kopf am zerbrechen wie man sich eine Eimerfunktion wie bei Paint schreiben kann?

Ich wollts eig erklären, mit Grenzflächen und so, aber ka wie ich das machen soll.

Also wer Paint kennt und die Eimerfunktion weiß was ich meine.


Falls jemand irgendeine Idee hat wie das ganze funktionieren könnte, bitte posten Smile
...

BladeRunner

Moderator

BeitragMi, Mai 21, 2008 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Füllfunktion: Du bestimmst die Farbe des Pixels an der Mausposition. Dann wird er umgefärbt. Nun ruft sich die Funkrion selbst auf (rekursiv), aber mit den Koordinaten über, unter, links und rechts von der Startposition und mit der Farbe als Parameter die Du ausgelesen hast. Wenn die nicht identisch ist wird nimmer weiter gefüllt, ist sie identisch wiederholt sich das Spiel.
(Das ist allerdings nur einer von vielen Möglichen Ansätzen für ein floodfill)
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

buja

BeitragMi, Mai 21, 2008 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, das hab ich mir auch so ähnlich gedacht.

Aber jetzt die Frage:
stellen wir uns vor ich habe ein Rechteck gezeichnet, und nur das soll gefüllt werden, da es keine Lücken hat.

Wenn ich also irgendwo im Rechteck klicke soll es ausgefüllt werden (Dabei ist die Farbe des Rechtecks-Randes egal so lange sie <> der aktuellen Farbe ist)

Hätte das Rechteck irgendwo eine Lücke, soll es zwar ausgefüllt werden, aber das geht dann weiter durch die Lücke... (ich hoffe hab das so erklärt dass man es einigermaßen verstehen konnte)
...

BladeRunner

Moderator

BeitragMi, Mai 21, 2008 15:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich suche grade die Frage?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

buja

BeitragMi, Mai 21, 2008 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Very Happy

Sorry, die Frage ist, wie könnte man sowas machen? Mir fehlen leider total die Ansätze dafür. Das Rechteck zu füllen dürfte kein Problem sein, aber wenn das Rechteck ne Lücke hat muss es ja weiter gehen. Und ab da habe ich keine Ahnung.

ein mini ansatz:


Pseudocode:

Ändere Pixelfarbe solange Farbe <> ausgewählteFarbe

If Pixelfarbe = ausgewählte Farbe ignorieren und Farbe lassen.




[/code]
...

BladeRunner

Moderator

BeitragMi, Mai 21, 2008 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, aber genau das hab ich doch oben beschrieben. Es werden die 4 angrenzenden Punkte untersucht ob sie dieselbe Farbe wie der Punkt haben von dem ausgegangen wird und wenn ja wird gefüllt und von dort weitergesucht. Wenn nein wird auch nicht mehr weiter untersucht von der Stelle aus. Damit wird das ganze automatisch bis an die Grenzen füllen und bei einer Lücke auch durch diese hindurch.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

buja

BeitragMi, Mai 21, 2008 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
ups, nicht nachgedacht...

Mit deiner funktion wird ja praktisch immer weiter geprüft oder?

Also ist meine Frage völlig unnötig

da es ja von selbst wieder aufhört.


[EDIT:] Mist da warst du schneller Very Happy
...

Vertex

BeitragMi, Mai 21, 2008 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
http://www-lehre.inf.uos.de/~c...index.html
(hoffe, dass ist das richtige Video)
vertex.dreamfall.at | GitHub

Ironstorm

Erstklassiger Contest-Veranstalter

BeitragDo, Mai 22, 2008 3:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich mache es wie BladeRunner.

Ich nehme das ausgewählte Tile/Pixel, überprüfen die Felder oben, unten, rechts und links und setze dessen Koordinaten bei Übereinstimmung in ein Type. Lege also für jedes Feld ein neues an. Dann gehe ich alle Types neu durch und automatisch werden die nächsten überprüft. Solange bis sich in meiner Type-Liste nichts mehr ändert.

MfG
Ironstorm
..:: blackbird design : blackbird photography : Futuro Verde : X-Commander ::..
MacBook | Intel Core 2 Duo 2,1 GHz | 2048 MB RAM | 80 GB HDD | Mac OS X 10.6.2 (Snow Leopard) | Adobe CS4 Design Premium

ozzi789

BeitragDo, Mai 22, 2008 12:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine gute Erweiterung zu Paint wär, das man die "Stärke" einstellen kann, sodass es nicht nur genau gleich farbige pixel füllt sonder 5-15 rbg toleranz hat.

(Wen man zmb ein Bild Masken will dan hats immer noch einen Rand weil Paint einen "Farberlauf" kreiert, hoffe du weis was ich mein Razz)
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Silver_Knee

BeitragDo, Mai 22, 2008 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
GIMP! würd ich sagen ^^ ne ich hab des auch schon mit rects realisiert... war aber nicht besonders schneller.... weil du immer kucken musst von wo bis wo....

ozzi789

BeitragDo, Mai 22, 2008 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finde Bladerunners Idee gar ned mal so schlecht Wink
(geht wahsrscheinlich au schnell)
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

TheProgrammer

BeitragDo, Mai 22, 2008 13:38
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat mit dem Begriff Floodfill eigentlich schon das richtige Stichwort gegeben. Wink

Mfg
TheProgrammer
aktuelles Projekt: The last day of human being

DerHase

BeitragDo, Mai 22, 2008 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf Blitzbasic.com findet man sowas im Codearchiv!
Play Satyr!
 

MCocktail

BeitragSo, Feb 10, 2013 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hätte ein Beispiel, das leider bei mir zu so etwas wie Memory Leak führt, aber was solls...
BlitzBasic: [AUSKLAPPEN]

Function FloodFill(x,y,r,g,b)
GetColor(x,y)
current_r=ColorRed()
current_g=ColorGreen()
current_b=ColorBlue()
GetColor x,y-1
If ColorRed()=current_r And ColorGreen()=current_g And ColorBlue()=current_b Then
FloodFill(x-1,y-1,r,g,b)
EndIf
GetColor x+1,y
If ColorRed()=current_r And ColorGreen()=current_g And ColorBlue()=current_b Then
FloodFill(x+1,y,r,g,b)
EndIf
GetColor x,y+1
If ColorRed()=current_r And ColorGreen()=current_g And ColorBlue()=current_b Then
FloodFill(x,y+1,r,g,b)
EndIf
GetColor x-1,y
If ColorRed()=current_r And ColorGreen()=current_g And ColorBlue()=current_b Then
FloodFill(x-1,y,r,g,b)
EndIf
Color r,g,b
Plot x,y
End Function


Das Programm stürtzt bei mir(also wenn ich diese Funktion verwende),ab.
Ist das vielleicht trotzdem ein guter Ansatz?

ZEVS

BeitragSo, Feb 10, 2013 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Ansatz kann sinnvolle Ergebnisse produzieren, wenn du darauf achtest, dass du nicht in endlosen Rekursionen landest. Momentan geht dein Programm wie folgt vor:
- Cool, der Pixel rechts von mir hat die gleiche Farbe. Ich rufe mal rekursiv auf:
--- Cool, der Pixel links von mir hat die gleiche Farbe. Ich rufe mal rekursiv auf:
----- Cool, der Pixel rechts von mir hat die gleiche Farbe. Ich rufe mal rekursiv auf:
--------- ...

ZEVS

P.S: Du machst dich unnötig unbeliebt, wenn du rote Warnungen in den Wind schlägst und in einem Thread schreibst, der bald fünf Jahre alt ist.
 

MCocktail

BeitragSo, Feb 10, 2013 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
ZEVS hat Folgendes geschrieben:

P.S: Du machst dich unnötig unbeliebt, wenn du rote Warnungen in den Wind schlägst und in einem Thread schreibst, der bald fünf Jahre alt ist.


Nun ja, aber das Problem war aus meiner Sicht recht aktuell, schließlich wäre es ja schade, wenn andere die Probleme bei sowas haben, keine Antwort bekommen, nur weil der thread bald sein 5. Jubiläum feiern wird. Die Problematik bei sowas seh ich nicht richtig ein.

Xeres

Moderator

BeitragSo, Feb 10, 2013 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du das exakt selbe Problem und der alte Thread bringt dir keine Lösung? Dann fühle dich frei, einen neuen Thread zu eröffnen (und ggf. auf diesen zu verweisen).
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

PhillipK

BeitragMo, Feb 11, 2013 1:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Um das ganze flott aufzulösen, bevor es noch leichenschändungsprobleme gibt:

Es bedarf meiner ansicht nach 2 änderungen. ZEVS hat ganz recht erkannt was sache ist:
Es wird ERST der umliegende bereich geprüft, DANN wird geplottet. Würde erst geplottet werden und DANN die umgebung gecheckt, würde es nichtmehr andauernd zu einer unendlichen rekursion kommen.
Um genauer zu sein, nurnoch ein spezialfall würde dafür sorgen:
1) Getcolor(x,y) zeigt die selben farbwerte auf wie r,g,b angibt und
2) es existiert noch ein anderer pixel der farbe irgendwo nebenan (oben,unten, links, rechts)

Hier mal mein mit halbwissen verbesserter code:
BlitzBasic: [AUSKLAPPEN]

Function FloodFill(x,y,r,g,b)
GetColor(x,y)
current_r=ColorRed()
current_g=ColorGreen()
current_b=ColorBlue()

If current_r = r And current_g = g And current_b = b Then Return ;abbruch da farbe identisch, aka: Ich bin eine fehlerquelle weil zwischen gesetzt und nicht gesetzt nichtmehr unterschieden werden kann!

;und natürlich: ERST Plotten DANN das vergnügen. Sonst gibts zevs geschildertes pingpong...
Color r,g,b
Plot x,y


GetColor x,y-1
If ColorRed()=current_r And ColorGreen()=current_g And ColorBlue()=current_b Then
FloodFill(x-1,y-1,r,g,b)
EndIf
GetColor x+1,y
If ColorRed()=current_r And ColorGreen()=current_g And ColorBlue()=current_b Then
FloodFill(x+1,y,r,g,b)
EndIf
GetColor x,y+1
If ColorRed()=current_r And ColorGreen()=current_g And ColorBlue()=current_b Then
FloodFill(x,y+1,r,g,b)
EndIf
GetColor x-1,y
If ColorRed()=current_r And ColorGreen()=current_g And ColorBlue()=current_b Then
FloodFill(x-1,y,r,g,b)
EndIf
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group