Linien Funktionen Test ;)

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Clonker

Betreff: Linien Funktionen Test ;)

BeitragSa, Okt 23, 2004 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte mal ausprobieren, ob es eine schnellere Methode Linien zu zeichnen gibt.
Meine suche danach war leider erfolglos.
Aber das Ergebniss ist trotzdem ganz interresant:

BlitzBasic: [AUSKLAPPEN]

;Linetest by Sebastian Steinmann

Graphics 640,480,32,2

Dim e(3) ;für Ergebnisse

;Test1
Cls
Text 100,10,\"Parametrisierte Geradengleichung\"

timer1 = MilliSecs()

For t = 1 To 50
For i = 1 To 640 Step 50
line2 0,0,i,480
Next
For i = 640 To 1 Step -50
line2 640,0,i,480
Next
Next

e(0) = MilliSecs() - timer1
Text 100,25,\"1200 Linien: \" + e(0) + \" ms\"
WaitKey()

;Test2
Cls
Text 100,10,\"Bresenham-Algorithmus\"

timer1 = MilliSecs()

For t = 1 To 50
For i = 1 To 640 Step 50
line3 0,0,i,480
Next
For i = 640 To 1 Step -50
line3 640,0,i,480
Next
Next

e(1) = MilliSecs() - timer1
Text 100,25,\"1200 Linien: \" + e(1) + \" ms\"
WaitKey()

;Test3
Cls
Text 100,10,\"Geradengleichung als Funktion\"

timer1 = MilliSecs()

For t = 1 To 50
For i = 1 To 640 Step 50
line4 0,0,i,480
Next
For i = 640 To 1 Step -50
line4 640,0,i,480
Next
Next

e(2) = MilliSecs() - timer1
Text 100,25,\"1200 Linien: \" + e(2) + \" ms\"
WaitKey()

;Test4
Cls
Text 100,10,\"BlitzBasic Line-Funktion\"

timer1 = MilliSecs()

For t = 1 To 50
For i = 1 To 640 Step 50
Line 0,0,i,480
Next
For i = 640 To 1 Step -50
Line 640,0,i,480
Next
Next

e(3) = MilliSecs() - timer1
Text 100,25,\"1200 Linien: \" + e(3) + \" ms\"
WaitKey()

;Zusammenfassung
Cls
Text 100,25,\"Zusammenfassung:\"
Text 100,50,\"BlitzBasic Line-Funktion: \" + e(3) + \"ms\"
Text 100,65,\"Geradengleichung als Funktion: \" + e(2) + \"ms\"
Text 100,80,\"Bresenham-Algorithmus: \" + e(1) + \"ms\"
Text 100,95,\"Parametrisierte Geradengleichung: \" + e(0) + \"ms\"

WaitKey() : End

;Linien Funktionen

;Parametrisierte Geradengleichung
Function line2(x, y, dx#, dy#)
LockBuffer
Local r#, step1#

px = x
py = y

dy# = dy - y
dx# = dx - x

step1# = 1.0 / Sqr(dx#*dx# + dy#*dy#)
r# = 0.0
While r < 1
r=r+step1
x = Int(x1 + r*dx +0.5)
y = Int(y1 + r*dy +0.5)
WritePixelFast(x+px,y+py,-1664454)
Wend
UnlockBuffer
End Function

;Bresenham-Algorithmus
Function line3(x1,y1,x2,y2)
LockBuffer
Local error, delta, schritt, inc_x, inc_y

x = x1 ; Koordinaten retten
y = y1

dy = y2 - y1 ; Hoehenzuwachs
dx = x2 - x1 ; Schrittweite

If dx > 0 ; Linie nach rechts?
inc_x = 1 ; x inkrementieren
Else ; Linie nach links
inc_x = -1 ; x dekrementieren
EndIf

If dy > 0 ; Linie nach unten?
inc_y = 1 ; y inkrementieren
Else ; Linie nach oben
inc_y = -1 ; y dekrementieren
EndIf

If(Abs(dy) < Abs(dx)) Then ; flach nach oben oder unten
error = Abs(dx) * (-1) ; Fehler bestimmen
delta = 2*Abs(dy) ; Delta bestimmen
schritt = 2*error ; Schwelle bestimmen
While x <> x2 ; Fuer jede x-Koordinate
WritePixelFast(x,y,-1664454) ; setze Pixel
x = x + inc_x ; naechste x-Koordinate
error = error + delta ; Fehler aktualisieren
If error > 0 ; neue Spalte erreicht?
y = y + inc_y ; y-Koord. aktualisieren
error = error + schritt ; Fehler aktualisieren
EndIf
Wend
Else ; steil nach oben oder unten
error = Abs(dy)* (-1) ; Fehler bestimmen
delta = 2*Abs(dx) ; Delta bestimmen
schritt = 2*error ; Schwelle bestimmen
While y <> y2 ; fuer jede y-Koordinate
WritePixelFast(x,y,-1664454) ; setze Pixel
y = y + inc_y ; naechste y-Koordinate
error = error + delta ; Fehler aktualisieren
If error > 0 Then ; neue Zeile erreicht?
x = x + inc_x ; x-Koord. aktualisieren
error = error + schritt ; Fehler aktualisieren
EndIf
Wend
EndIf
WritePixelFast(x2,y2,-1664454) ; letztes Pixel hier setzen ; falls (x1==x2) & (y1==y2)
UnlockBuffer
End Function

;Geradengleichung als Funktion
Function line4(x1,y1,x2,y2)
LockBuffer
Local x, y
Local s#, c#

s = Float(y2 - y1) / Float(x2 - x1) ; Steigung berechnen
c = Float(y1*x2 - y2*x1) / Float(x2 - x1) ; y-Achsenabschnitt


x = x1 ; Koordinaten retten
y = y1

If x < x2 Then ; Linie links -> rechts
While x <= x2 ; fuer jede x-Koordinate
y = Int(s*x + c + 0.5) ; berechne y-Koordinate
WritePixelFast(x,y,-1664454) ; setze Pixel
x = x + 1 ; naechste x-Koordinate
Wend
Else ; Linie rechts -> links
While x >= x2 ; fuer jede x-Koordinate
y = Int(s*x + c + 0.5) ; berechne y-Koordinate
WritePixelFast(x,y,-1664454) ; setze Pixel
x = x - 1 ; naechste x-Koordinate
Wend
EndIf

UnlockBuffer
End Function

Die exzessive Akkumulation von Fremdwörtern suggeriert pseudointellektuelle Kompetenz.

Athlon XP 2800|Radeon 9600 Pro|512MB DDR RAM|240GB Festplatte

Lord_Vader

BeitragSa, Okt 23, 2004 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein aber als gerade linien soll man rect benutzen soll 2000% schnell sein. Ich habs net probiert is aber so!

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group