FastLine von blitzbase.de funktioniert nicht richtig...

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

entres

Betreff: FastLine von blitzbase.de funktioniert nicht richtig...

BeitragDi, Sep 25, 2007 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo. Auf Blitzbase.de ist im Codearchiv eine Function um besonders schnell eine Linie zu zeichnen. Hier geht es zum Original: http://www.blitzbase.de/quellcode/bresenham.bb

Nun habe ich das Beispiel bei mir übertragen und wollte es einfach mal austesten. der Code sieht so aus:
Code: [AUSKLAPPEN]

Graphics 800, 600
SetBuffer BackBuffer()

Repeat
   Cls

   FastLine 0,0,MouseX(),MouseY(), 255,255,255
   Flip
Until KeyDown(1)
End


Function FastLine(x1, y1, x2, y2, r, g, b)
   ;DebugLog x1 +" "+ y1 +" "+ x2 +" "+ y2 +" "+ r +" "+ g +" "+ b
   farbe = r*$10000 + g*$100 + b
   dx = x2 - x1
   dy = y2 - y1
   
   If dx > 0 Then
      inc_x = 1
   Else
      inc_x = -1
   EndIf
   If dy > 0 Then
      inc_y = 1
   Else
      inc_y = -1
   EndIf
   
   If Abs(dy) < Abs(dx) Then
      error = -Abs(dx)
      delta = 2 * Abs(dy)
      schwelle = 2 * error
      While x1 <> x2
         WritePixelFast x1, y1, farbe
         x1 = x1 + inc_x
         error = error + delta
         If error > 0 Then y1 = y1 + inc_y: error = error + schwelle
      Wend
   Else
      error = -Abs(dy)
      delta = 2 * Abs(dx)
      schwelle = 2 * error
      While y1 <> y2
         ;DebugLog x1 +" "+ y1 +" "+ farbe
         WritePixelFast x1, y1, farbe
         y1 = y1 + inc_y
         error = error + delta
         If error > 0 x1 = x1 + inc_x: error = error + schwelle
         Wend
      EndIf
      WritePixelFast x2, y2, farbe
End Function



Wenn ich dieses Program nun in der Form ausführen möchte stürzt es mit einem Speicher Zugriffsfehler ab.

Ich hab ein wenig rumgespielt und hab nun vor dem Fastline ein normales line hingesetzt:
Code: [AUSKLAPPEN]

Graphics 800, 600
SetBuffer BackBuffer()

Repeat
   Cls
   Line 0, 0, 0, 0
   FastLine 0,0,MouseX(),MouseY(), 255,255,255
   Flip
Until KeyDown(1)
End


Function FastLine(x1, y1, x2, y2, r, g, b)
   ;DebugLog x1 +" "+ y1 +" "+ x2 +" "+ y2 +" "+ r +" "+ g +" "+ b
   farbe = r*$10000 + g*$100 + b
   dx = x2 - x1
   dy = y2 - y1
   
   If dx > 0 Then
      inc_x = 1
   Else
      inc_x = -1
   EndIf
   If dy > 0 Then
      inc_y = 1
   Else
      inc_y = -1
   EndIf
   
   If Abs(dy) < Abs(dx) Then
      error = -Abs(dx)
      delta = 2 * Abs(dy)
      schwelle = 2 * error
      While x1 <> x2
         WritePixelFast x1, y1, farbe
         x1 = x1 + inc_x
         error = error + delta
         If error > 0 Then y1 = y1 + inc_y: error = error + schwelle
      Wend
   Else
      error = -Abs(dy)
      delta = 2 * Abs(dx)
      schwelle = 2 * error
      While y1 <> y2
         ;DebugLog x1 +" "+ y1 +" "+ farbe
         WritePixelFast x1, y1, farbe
         y1 = y1 + inc_y
         error = error + delta
         If error > 0 x1 = x1 + inc_x: error = error + schwelle
         Wend
      EndIf
      WritePixelFast x2, y2, farbe
End Function


Und siehe da, auf einmal geht es wie am Schnürchen ^^

Irgendwie ist das ein sehr komischer Fehler. Ich kann das fastline erst verwenden wenn ich line vorher verwende... woran könnte das liegen Question

BladeRunner

Moderator

BeitragDi, Sep 25, 2007 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Das liegt daran dass die Koordinaten wohl noch undefiniert sind.
Dein Problem liegt aber per se daran dass Du writepixelfast benutztr ohne den Buffer zu locken.
Mach am Beginn der Funktion ein lockbuffer backbuffer() und am ende ein unlockbuffer backbuffer() und alles funzt.

EDIT: um die Funktion universal nutzbar zu machen, speicher den Handle des Buffers in eine Variable und übergeb den an die Funktion:
Code: [AUSKLAPPEN]
a = Backbuffer()
fastline x,y,zx,zy,r,g,b,a

function fastline(......,buff)
lockbuffer buff
...
unlockbuffer buff
end function


Du kannst dann auch imagebuffer etc. an die Funktion geben (a= imagebugffer(xyz)) und somit auf jeden beliebigen Buffer schnellzeichnen...

EDIT2: vergiss das, nimm einfach lockbuffer ohne parameter, dann wird automatisch der aktuelle genommen. ich werd alt.
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

entres

BeitragMi, Sep 26, 2007 13:16
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat Folgendes geschrieben:
Das liegt daran dass die Koordinaten wohl noch undefiniert sind.
Dein Problem liegt aber per se daran dass Du writepixelfast benutztr ohne den Buffer zu locken.
Mach am Beginn der Funktion ein lockbuffer backbuffer() und am ende ein unlockbuffer backbuffer() und alles funzt.

EDIT: um die Funktion universal nutzbar zu machen, speicher den Handle des Buffers in eine Variable und übergeb den an die Funktion:
Code: [AUSKLAPPEN]
a = Backbuffer()
fastline x,y,zx,zy,r,g,b,a

function fastline(......,buff)
lockbuffer buff
...
unlockbuffer buff
end function


Du kannst dann auch imagebuffer etc. an die Funktion geben (a= imagebugffer(xyz)) und somit auf jeden beliebigen Buffer schnellzeichnen...

EDIT2: vergiss das, nimm einfach lockbuffer ohne parameter, dann wird automatisch der aktuelle genommen. ich werd alt.


Danke für die Hilfe! Mit der lockbuffer Methode klappt es wunderbar. Allerdings ist das Risiko den computer abstürzen zu lassen durch writepixelfast fast recht hoch und der Performancevorteil beträgt auch nur um die 40%....

Ist recht nett, aber ich bleibe glaube ich lieber beim alten line. Ist einfach sicherer.

BladeRunner

Moderator

BeitragMi, Sep 26, 2007 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn Du den Buffer lockst ist dein Risiko gleich null, denn genau dafür ist der Befehl da.
Alternative kannst Du selbst prüfen ob Start- und Endpunkt der Linie im sichtbaren Bildschirm liegen und nur dann zeichnen lassen, auch das ist absolut sicher und geht sehr schnell.
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 Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group