Ausfüllen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Gast

Betreff: Ausfüllen

BeitragFr, Okt 01, 2004 17:36
Antworten mit Zitat
Hi!

Bin gerade dabei ein Graphicprogramm zu erstellen!
Bei Paint gibt es eine "ausfüllen Funktion" die ich auch gerne einbauen würde.
Bei Paint ganz links kann man die Funktionen auswählen. Bei der rechten Spalte die 2. Zeile von oben, ist die Funktion die ich auch erstellen möchte.
ich versuche es aber auch zu erklären:
seht euch mal diesen Quelltext an:

Code: [AUSKLAPPEN]

Graphics 800,600
SetBuffer BackBuffer()

ClsColor 0,0,0
Cls

Color 255,255,255
Rect 200,200,400,200

Color 00,0,0
Rect 250,250, 300,100

WaitKey


das sind nur ein paar rechtecke!
wenn ich in das "innerste" Rechteck klicke soll es statt weiss schwarz werden, wobei das äußere schwarze rechteck die farbe behalten soll!

wenn ich aber noch ein rechteck einbaue,

Code: [AUSKLAPPEN]

Graphics 800,600
SetBuffer BackBuffer()

ClsColor 0,0,0
Cls

Color 255,255,255
Rect 200,200,400,200

Color 00,0,0
Rect 250,250, 300,100

Color 0,0,0
Rect 300,0,20,300

WaitKey


...und in das mittlere feld klicke, soll auch das weiß werden.
ABER: in einem Programm kann man individuell eigene schritte machen, wo ich weitere punkte, kreise,usw zeichen kann und diese sollen auch beachtet werden!

ist sehr kompliziert zu beschreiben, ich weiß.

Könnt ihr mir vielleicht einen Quellcode dazu schicken, wie ich das machen könnte?


Danke
lg

sidolin

BeitragFr, Okt 01, 2004 17:42
Antworten mit Zitat
Benutzer-Profile anzeigen
warum ein grafik-programm selber progen ? es genug für umme. also ich würd mir nicht die mühe machen.

..:: P4 1500 MHZ : 512 MB RDRAM : GFORCE 4 ::..
 

totonak5

BeitragFr, Okt 01, 2004 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
weiß ich!
aber ich möchte bestimmte Funktionen einmal selbst programmieren oder zumindest versuchen!
nur so als übung halt! so einfache sachen bringe ich schon zusammen.

lg
Just for Fun!
Jesus loves U!

BladeRunner

Moderator

BeitragFr, Okt 01, 2004 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, Code wirst du keinen erhalten, aber ich geb dir mal ne Anregung für das was du willst (Füllfunktion).
Wenn du irgendwo mit der Maus klickst, merkst du dir die Farbe des Punktes an den Du geklickt hast.
dann setzt du diesen punkt auf die Füllfarbe. Dann schaust du bei den Punkten links,rechts oben und unten vom ersten punkt ob sie die zu befüllende farbe haben. wenn ja, werden auch sie gefüllt. so geht das Spielchen weiter bis nur noch punkte gefunden werden, welche nicht der beim ersten Mausklick gefundenen Farbe entsprechen.
Ideal hierfür ist eine sich selbst aufrufende (=rekursive) Funktion.
Der Ansatz hier ist noch nicht perfekt (es ist zB möglich dass es zu "Lecks" kommt welche den Bildschirm fluten), aber er stellt eine Möglichkeit dar. Mal dir das vorgehen dieses Algos mal auf ein Stück Papier und tüftle einen Code aus.
(es gibt natürlich noch dutzende andere. Du könntest die Zeichenhierarchie in einem Dim-Feld speichern und und und ...)
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
 

totonak5

BeitragFr, Okt 01, 2004 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, das möchte ich auch so machen.
aber wenn ich diese punkte dann auch "dauerhaft einfärben" will muss ich das mit feldern machen.
wenn ich das auf einem format von 800,600 mache, muss ich ein 480000er Feld machen aber das ist einfach zu groß.
ich suche nach einer anderen lösung.

lg
Just for Fun!
Jesus loves U!

BladeRunner

Moderator

BeitragFr, Okt 01, 2004 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Glaub mir es geht so (ich hab exakt so eine Füllroutine geschrieben). Du kannst ja schon gefüllte Pixel aus der Liste streichen, und bei einer (eventuellen) nochmaligen Prüfung werden sie ja nicht mehr aufgenommen, da schon gefüllt.
Das Array wird also nicht maximal gross werden.
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

rambo256

BeitragFr, Okt 01, 2004 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
mach das mit readpixelfast.
damit checkst du dann die farbe der umliegenden punkte ab und dann,wenn sie der farbe entsprecen,wo du draufgeklickt hast,zeicnest du mit writepixelfast einen punkt in der entsprechenden farbe hin.
ist so mein erster gedanke.
Asus F53z

Das Leben ist eine reine Konkatenation...
 

totonak5

BeitragSa, Okt 02, 2004 11:39
Antworten mit Zitat
Benutzer-Profile anzeigen
das versteh ich nicht wie soll ich die aus der liste streichen???
Just for Fun!
Jesus loves U!

Firstdeathmaker

BeitragSo, Okt 03, 2004 5:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versteh das mit dem Dim-Feld nicht. Das braucht man doch hier garnicht. Man hat doch die Farbwerte schon auf dem Bildschirm/Buffer. Der Funktioniert doch genauso.


Zu der eigentlichen Frage (Beispielcode, nur so vom Ansatz her...):

Code: [AUSKLAPPEN]
Function ausfuellen(x,y,farbwert)
lockbuffer ;Deinbuffer;
original=readpixelfast(x,y)
writepixelfast x,y,farbwert
ausfuellen2(x-1,y,farbwert,original)
ausfuellen2(x+1,y,farbwert,original)
ausfuellen2(x,y-1,farbwert,original)
ausfuellen2(x,y+1,farbwert,original)
unlockbuffer ;Deinbuffer;
end function

Function ausfuellen2(x,y,farbwert,original)
if readpixelfast(x,y)=original
 writepixelfast x,y,farbwert
 ausfuellen2(x-1,y,farbwert,original)
 ausfuellen2(x+1,y,farbwert,original)
 ausfuellen2(x,y-1,farbwert,original)
 ausfuellen2(x,y+1,farbwert,original)
endif
end function
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

BladeRunner

Moderator

BeitragSo, Okt 03, 2004 14:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
aber wenn ich diese punkte dann auch "dauerhaft einfärben" will muss ich das mit feldern machen.

Wenn du alles in den Imagebuffer schreibst kannst du dir ein Feld welches jeden Pixel enthält sparen. Du darfst den Buffer nur später nicht löschen.
Wenn Du ein "Undo" willst gibt es mehrere Möglichkeiten: 1. nach jedem Arbeitsschritt den Imagebuffer zwischenspeichern (klappt immer, aber sehr speicherintensiv)
2. Du speicherst nur die "einsprungpunkte" der aufgerufenen Funktionen ab einem Startbild. Erneutes Aufrufen der Funktionen mit den Startwerten ab diesem Bild stellt das gewünschte Ergebnis her. (aufwändiger, jedoch sehr platzsparend)
3. Du berechnest in einer Funktion die unterschiedlichen Bytes zwischen Altem und neuen Bild und speicherst komprimiert diese Änderungen (variabler Platzbedarf, recht kompliziert).
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group