Flächen-Füllroutine

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Clonker

Betreff: Flächen-Füllroutine

BeitragMi, Okt 27, 2004 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie der name schon sagt, füllt diese Routine beliebige Flächen aus.
Ich würde mich über Feedback freuen.

BlitzBasic: [AUSKLAPPEN]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Füllroutine by Sebastian Steinmann ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Graphics 640,480,32,2

SeedRnd MilliSecs()

Global Frames,ZaehlStart,FramesJeSekunde
Global rgb,rgb2
Global font = LoadFont(\"Arial\",14,1,0,0)
SetFont font

;Hintergrundbild
bild = CreateImage (640,480)
SetBuffer ImageBuffer(bild)
Color Rand(10,50),Rand(10,50),Rand(190,255)
Rect 0,0,640,480,0
Rect 400,400,100,100,0
Rect 0,200,200,200,0
Oval 10,10,100,100,0
Oval 40,40,100,100,0
Color Rand(10,50),Rand(190,255),Rand(10,50)
Oval 90,90,200,200,0
Oval 90,190,150,150,0
Line 100,0,420,480
Line 200,0,420,480
Line 0,0,420,480
Color Rand(190,255),Rand(190,255),Rand(10,50)
Line 300,0,420,480
Line 400,0,420,480
Line 640,0,420,480
Line 500,0,420,480
Line 640,0,100,480
Line 640,0,0,480
Color Rand(190,255),Rand(10,50),Rand(10,50)
Line 0,200,300,480
Line 640,480,400,0
Line 640,480,500,0
Line 640,480,300,0

SetBuffer BackBuffer()
Repeat
Cls
DrawImage bild,0,0
If MouseDown(1) Then
msstart = MilliSecs()

Fuellen(MouseX(),MouseY(),farbe,255,0)

msserg = MilliSecs() - msstart
If farbeX = 1 Then farbe = farbe - 5
If farbeX = 0 Then farbe = farbe + 5
If farbe = 255 Then farbeX = 1
If farbe = 10 Then farbeX = 0
EndIf


Color 10,10,150
Rect 10,10,StringWidth(\" FPS: \" + FramesJeSekunde + \" Pro Zeichnen: \" + msserg + \" ms \"),StringHeight(\"FPS: \" + FramesJeSekunde + \" Pro Zeichnen: \" + msserg+ \" ms \")
Color 255,255,255
Text 10,10,\" FPS: \" + FramesJeSekunde + \" Pro Zeichnen: \" + msserg + \" ms \"


FPS()
Flip
Until KeyHit(1)


;Die Füllroutine
Function Fuellen(x,y,r2,g2,b2)
rgb=ReadPixel(x,y)
rgb2=1*$1000000 + r2*$10000 + g2*$100 + b2
Color r2,g2,b2
Fuellen2(x,y)
End Function

Function Fuellen2(x,y)

px = x ;Ursprüngliche Position speichern

While ReadPixelFast(x,y) = rgb ;Freie Pixel nach links zählen
x = x - 1
Wend

lr = x+1 ;Linken Randpixel speichern

x = px + 1 ;Ursprüngliche X-Position wiederherstellen

While ReadPixelFast(x,y) = rgb ;Freie Pixel nach rechts zählen
x = x + 1
Wend

Rect lr,y,x-lr,1 ;Zeichnen - rect ist schneller als WritePixelFast

rr = x-1 ;Rechten Randpixel speichern

For x = lr To rr ;Von links nach rechts

If ReadPixelFast(x,y-1) = rgb Then ;Wenn Pixel nach unten frei ist
Fuellen2(x,y-1) ;Funktion rekursiv an neuer Position starten
EndIf

If ReadPixelFast(x,y+1) = rgb Then ;Wenn Pixel nach oben frei ist
Fuellen2(x,y+1) ;Funktion rekursiv an neuer Position starten
EndIf
Next
End Function

Function FPS()
Frames = Frames + 1

If ZaehlStart + 1001 < MilliSecs() Then
FramesJeSekunde = Frames
Frames = 0
ZaehlStart = MilliSecs()
EndIf
End Function


Hier noch ein Bild zur Veranschaulichung:
user posted image
Die exzessive Akkumulation von Fremdwörtern suggeriert pseudointellektuelle Kompetenz.

Athlon XP 2800|Radeon 9600 Pro|512MB DDR RAM|240GB Festplatte
  • Zuletzt bearbeitet von Clonker am Do, März 31, 2005 14:36, insgesamt 2-mal bearbeitet
 

getlose

BeitragMi, Okt 27, 2004 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
gut gemacht, gibt nur leider schon etliche fuellroutinen :)
aber trotzdem, nicht schlecht

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMi, Okt 27, 2004 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Proggi geht aber nicht gerade sparsam mit dem Stack um,
je weiter man unten klickt desto wahrscheinlicher wird ein Stackoverflow!
[BB2D | BB3D | BB+]

Lord_Vader

BeitragMi, Okt 27, 2004 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Was auch immer "Stack" is ^^ es hört bei mir nach ner weile auf wenn ich die maus gedrückt lasse und wild herumfahre..

Clonker

BeitragMi, Okt 27, 2004 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm stimmt

ich glaub so ist es besser, zumindest bekomme ich so keinen stack overflow.



BlitzBasic: [AUSKLAPPEN]

;Die Füllroutine
Function Fuellen2(x,y)

px = x

While ReadPixelFast(x,y) = rgb
WritePixelFast(x, y,rgb2)
x = x - 1
Wend

lr = x+1

x = px + 1

While ReadPixelFast(x,y) = rgb
WritePixelFast(x, y,rgb2)
x = x + 1
Wend

rr = x-1

For x = lr To rr

If ReadPixelFast(x,y-1) = rgb Then
Fuellen2(x,y-1)
EndIf

If ReadPixelFast(x,y+1) = rgb Then
Fuellen2(x,y+1)
EndIf
Next
End Function

Function Fuellen(x,y,r2,g2,b2)
rgb=ReadPixel(x,y)

a=(rgb And $FF000000)/$1000000
r3=(rgb And $FF0000)/$10000
g3=(rgb And $FF00)/$100
b3=rgb And $FF

rgb2=a*$1000000 + r2*$10000 + g2*$100 + b2

If rgb <> rgb2 Then
LockBuffer
Fuellen2(x,y)
UnlockBuffer
EndIf
End Function

Die exzessive Akkumulation von Fremdwörtern suggeriert pseudointellektuelle Kompetenz.

Athlon XP 2800|Radeon 9600 Pro|512MB DDR RAM|240GB Festplatte
  • Zuletzt bearbeitet von Clonker am Do, Okt 28, 2004 18:58, insgesamt einmal bearbeitet

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group