http://www.glbasic.com/en/download.html
I've converted the code to Purebasic, but there are a few problems.
1) Something is going wrong with the floating point arithmatic, resulting in some incorrect colours.
2) It isn't running anywhere near as fast as the Blitz or GLEntries 8O.
Am I doing anything wrong. Can anybody fix it?
Improving the algorythm doesn't count.
Code: Select all
; --------------------------------- ;
; Project: Mandelbrot - Speedtest
; Start: Tuesday, September 09, 2003
; PB Version: 3.90
; Based on GLBasic code at http://www.glbasic.com/en/download.html
; Converted by Ged Byrne
#max.f = 128 ; #max iterations
#x1 = 640 ; ScreenX
#y1 = 480 ; ScreenY
xstart.f = -2.025
ystart.f = -1.125
xende.f = 0.6
yende.f = 1.125
xzoom.f = (xende - xstart) / #x1
yzoom.f = (yende - ystart) / #y1
fac.f = 0.99
Procedure HSB2RGB(hue.f, saturation.f, brightness.f)
If brightness = 0
ProcedureReturn 0
EndIf
If saturation = 0
ProcedureReturn RGB(brightness*255, brightness*255, brightness*255)
EndIf
DefType.f red, green, blue, domainOffset
If hue < 1.0/6
; red domain; green ascends
domainOffset = hue
red = brightness
blue = brightness * (1.0 - saturation)
green = blue + (brightness - blue) * domainOffset * 6
ElseIf hue < 2.0/6
; yellow domain; red descends
domainOffset = hue - 1.0/6
green = brightness
blue = brightness * (1.0 - saturation)
red = green - (brightness - blue) * domainOffset * 6
ElseIf hue < 3.0/6
; green domain; blue ascends
domainOffset = hue - 2.0/6
green = brightness
red = brightness * (1.0 - saturation)
blue = red + (brightness - red) * domainOffset * 6
ElseIf hue < 4.0/6
; cyan domain; green descends
domainOffset = hue - 3.0/6
blue = brightness
red = brightness * (1.0 - saturation)
green = blue - (brightness - red) * domainOffset * 6
ElseIf hue < 5.0/6
; blue domain; red ascends
domainOffset = hue - 4.0/6
blue = brightness
green = brightness * (1.0 - saturation)
red = green + (brightness - green) * domainOffset * 6
Else
; magenta domain; blue descends
domainOffset = hue - 5.0/6
red = brightness
green = brightness * (1.0 - saturation)
blue = red - (brightness - green) * domainOffset * 6
EndIf
ProcedureReturn RGB(red * 255, green * 255, blue * 255)
EndProcedure
Procedure.f DotsColor(xval.f, yval.f) ; color value from 0.0 to 1.0 by iterations
DefType.f i, m, r, j
While (j < #max) And (m < 4.0)
j=j+1
m = r * r - i * i
i = 2.0 * r * i + yval
r = m + xval
Wend
ProcedureReturn j / #max
EndProcedure
Procedure mandelbrot(xstart.f, ystart.f, xzoom.f, yzoom.f) ; calculate all points
DefType.f h, old
For x = 0 To #x1 - 1
For y = 0 To #y1 - 1
h = DotsColor(xstart + (xzoom * x), ystart + (yzoom * y)) ; color value
If h <> old
b = 1.0 - h * h ; brightness
col = HSB2RGB(h, 0.8, b)
old = h;
EndIf
Plot(x, y, col)
Next
Next
EndProcedure
If InitKeyboard() And InitSprite() And OpenScreen(#x1, #y1, 16, "Mandelbrot")
Repeat
xende = xende * fac
xstart = xstart * fac
ystart = ystart * fac
yende = yende * fac
xzoom = (xende - xstart) / #x1
yzoom = (yende - ystart) / #y1
timer = gettickcount_()
StartDrawing(ScreenOutput())
mandelbrot(xstart.f, ystart.f, xzoom.f, yzoom.f)
timer = gettickcount_() - timer
speed = Int(#x1*#y1 / (1+(timer)))
Locate(0,0)
DrawText("Speed: " + Str(speed) + " Kpix/sec. Press and hold escape to exit")
StopDrawing()
FlipBuffers()
Until ExamineKeyboard() And KeyboardPushed(#PB_Key_Escape)
EndIf





