Fractal - Julia Set

Miscellaneous Forums/Blitz Showcase/Fractal - Julia Set

Here is a little program I built last night for playing with Julia sets.

http://www.scottshaver2000.com/blitz/demo6/julia1.exe

Cool wee program mate!

Thanks,

here is another for the Mandelbrot set

http://www.scottshaver2000.com/blitz/demo6/mandelbrot1.exe

I love this stuff!

Any chance of some code? What program is this made in?

great stuff but the zoom doesnt work on the mandlebrot set

julia
Strict

Framework BRL.GlMax2D
Import BRL.System
Import BRL.Basic
Import BRL.Retro
Import BRL.Max2D


Graphics 640,480

' Simple Program To Display The Julia Set
Global CX:Double = .344999
Global CY:Double = .074999
Global CCycle:Byte = False
Global in:Byte = False
Global colors:Int[,] = Null
createColors(0)
Global iwidth:Int = 320
Global iheight:Int = 240
Global isize:Int = 3

Cls
While Not KeyHit(KEY_ESCAPE)
	SetBlend(ALPHABLEND)
	SetRotation(0)
	SetColor(0,0,0)
	SetAlpha(.05)
	DrawRect(0,0,800,600)
	SetAlpha(1)
	
	If KeyHit(KEY_1)
		createColors(0)
	ElseIf KeyHit(KEY_2)
		createColors(1)
	ElseIf KeyHit(KEY_3)
		createColors(2)
	EndIf
	
	If KeyHit(KEY_TAB)
		CCycle = Not CCycle
	EndIf
	If KeyHit(KEY_SPACE)
		in = Not in
	EndIf
	
	colorCycle()

	If KeyDown(KEY_RIGHT)
		CX:+.0005
	Else If KeyDown(KEY_LEFT)
		CX:-.0005
	EndIf
	If KeyDown(KEY_DOWN)
		CY:+.0005
	Else If KeyDown(KEY_UP)
		CY:-.0005
	EndIf
	
	If Not in Then
		outJulia(CX,CY,iwidth,iheight,24,isize,-iwidth/2,-iheight/2)
	Else
		inJulia(CX,CY,iwidth/2,iheight/2,24,isize+1)
	EndIf 
	
	
	SetColor(0,0,0)
	DrawText("CX="+CX+" CY="+CY,12,12)
	DrawText("TAB - Toggle Color Cycle",12,27)
	DrawText("SPACE - Toggle IN/OUT Set",12,42)
	DrawText("1,2,3 - Select Color Set",12,57)
	DrawText("UP/DOWN - Change CY",12,72)
	DrawText("LEFT/RIGHT - Change CX",12,87)
	
	SetColor(255,255,255)
	DrawText("CX="+CX+" CY="+CY,10,10)
	DrawText("TAB - Toggle Color Cycle",10,25)
	DrawText("SPACE - Toggle IN/OUT Set",10,40)
	DrawText("1,2,3 - Select Color Set",10,55)
	DrawText("UP/DOWN - Change CY",10,70)
	DrawText("LEFT/RIGHT - Change CX",10,85)
	
	Flip 
Wend

Function colorCycle()
	If CCycle=False Then Return
	Local cc:Int = colors.dimensions()[0]
	Local r:Int = colors[cc-1,0]
	Local g:Int = colors[cc-1,1]
	Local b:Int = colors[cc-1,2]
	For Local i:Int=cc-1 Until 0 Step -1
		colors[i,0]=colors[i-1,0]
		colors[i,1]=colors[i-1,1]
		colors[i,2]=colors[i-1,2]
	Next
	colors[0,0]=r
	colors[0,1]=g
	colors[0,2]=b
End Function

Function createColors(set:Byte)
	Select(set)
	Case 0
	'Rem grey shades
	'------------------------------------
	colors=New Int[256,3]
	For Local ci:Int = 0 Until 256
		colors[ci,0]=ci
		colors[ci,1]=ci
		colors[ci,2]=ci
	Next
	'EndRem
	Case 1
	'Rem darks to lights
	'------------------------------------
	colors=New Int[768,3]
	For Local ci:Int = 0 Until 256
		colors[ci,0]=ci
		colors[ci,1]=0
		colors[ci,2]=0
		colors[ci+256,0]=0
		colors[ci+256,1]=ci
		colors[ci+256,2]=0
		colors[ci+512,0]=0
		colors[ci+512,1]=0
		colors[ci+512,2]=ci
	Next
	'EndRem
	Case 2
	'Rem mid to light to mid
	'------------------------------------
	colors=New Int[768,3]
	For Local ci:Int = 0 Until 128
		colors[ci,0]=ci+128
		colors[ci,1]=0
		colors[ci,2]=0
		colors[ci+256,0]=0
		colors[ci+256,1]=ci+128
		colors[ci+256,2]=0
		colors[ci+512,0]=0
		colors[ci+512,1]=0
		colors[ci+512,2]=ci+128
	Next
	For Local ci:Int = 128 Until 256
		colors[ci,0]=256-ci+128
		colors[ci,1]=0
		colors[ci,2]=0
		colors[ci+256,0]=0
		colors[ci+256,1]=256-ci+128
		colors[ci+256,2]=0
		colors[ci+512,0]=0
		colors[ci+512,1]=0
		colors[ci+512,2]=256-ci+128
	Next
	'EndRem
	End Select
End Function

Function inJulia(CX:Double,CY:Double,WIDTH:Int,HEIGHT:Int,Detail:Int,size:Int,xoff:Int=0,yoff:Int=0)
	SetOrigin(xoff,yoff)
	Local HALF_WIDTH:Double = WIDTH/2
	Local HALF_HEIGHT:Double = HEIGHT/2
	Local QUAR_WIDTH:Double = WIDTH/4
	Local QUAR_HEIGHT:Double = HEIGHT/4
	For Local PixelY:Int = 0 To HEIGHT
		For Local PixelX:Int = 0 To WIDTH
		    	Local ZX:Double = ((PixelX - HALF_WIDTH) / QUAR_WIDTH)
		    	Local ZY:Double = ((PixelY - HALF_HEIGHT) / QUAR_HEIGHT)
		    	For Local i:Int = 0 To Detail
			      	Local NewZX:Double = (ZX * ZX) - (ZY * ZY) + CX
			      	Local NewZY:Double = ((2 * ZX) * ZY) + CY
			      	ZX = NewZX
			      	ZY = NewZY
					Local DISTANCE:Double = (ZX*ZX) + (ZY*ZY)
			      	If DISTANCE > 4 Then 
						DISTANCE=4/DISTANCE * (colors.dimensions()[0]-1)
						SetColor(colors[DISTANCE,0],colors[DISTANCE,1],colors[DISTANCE,2])
						DrawRect((pixelx)*size,(pixely)*size,size,size)
						Exit ' Go to nextpoint
					EndIf
	    		Next
		Next 
	Next
	SetOrigin(0,0)
End Function

Function outJulia(CX:Double,CY:Double,WIDTH:Int,HEIGHT:Int,Detail:Int,size:Int,xoff:Int=0,yoff:Int=0)
	SetOrigin(xoff,yoff)
	Local HALF_WIDTH:Double = WIDTH/2
	Local HALF_HEIGHT:Double = HEIGHT/2
	Local QUAR_WIDTH:Double = WIDTH/4
	Local QUAR_HEIGHT:Double = HEIGHT/4
	For Local PixelY:Int = 0 To HEIGHT
		For Local PixelX:Int = 0 To WIDTH
		    	Local ZX:Double = (PixelX - HALF_WIDTH) / QUAR_WIDTH
		    	Local ZY:Double = (PixelY - HALF_HEIGHT) / QUAR_HEIGHT
				Local DISTANCE:Double = 0 
			    For Local i:Int = 0 To Detail
			      	Local NewZX:Double = (ZX * ZX) - (ZY * ZY) + CX
			      	Local NewZY:Double = ((2 * ZX) * ZY) + CY
			      	ZX = NewZX
			      	ZY = NewZY
					DISTANCE = (ZX*ZX) + (ZY*ZY)
			      	If DISTANCE > 4 Then Exit ' Go to nextpoint
	    		Next
			If DISTANCE<4 Then
				If DISTANCE>1 Then DISTANCE=1
				DISTANCE=DISTANCE * (colors.dimensions()[0]-1)
				SetColor(colors[DISTANCE,0],colors[DISTANCE,1],colors[DISTANCE,2])
				DrawRect(pixelx*size,pixely*size,size,size)
			EndIf
		Next 
	Next
	SetOrigin(0,0)
End Function



Mandelbrot
Strict

Framework BRL.GlMax2D
Import BRL.System
Import BRL.Basic
Import BRL.Retro
Import BRL.Max2D


Graphics 640,480

' Simple Program To Display The Julia Set
'Global CX:Double = .344999
'Global CY:Double = .074999
Global CX:Double = 0
Global CY:Double = 0
Global CCycle:Byte = False
Global in:Byte = False
Global colors:Int[,] = Null
Global scale:Double = .02
createColors(0)
Global iwidth:Int = 320
Global iheight:Int = 240
Global isize:Int = 3

Cls
While Not KeyHit(KEY_ESCAPE)
	SetBlend(ALPHABLEND)
	SetRotation(0)
	SetColor(0,0,0)
	SetAlpha(.05)
	DrawRect(0,0,800,600)
	SetAlpha(1)
	
	If KeyHit(KEY_1)
		createColors(0)
	ElseIf KeyHit(KEY_2)
		createColors(1)
	ElseIf KeyHit(KEY_3)
		createColors(2)
	EndIf
	
	If KeyHit(KEY_TAB)
		CCycle = Not CCycle
	EndIf
	If KeyHit(KEY_SPACE)
		in = Not in
	EndIf
	
	colorCycle()

	If KeyDown(KEY_OPENBRACKET)
		'scale:/60
		scale:+.00005
	Else If KeyDown(KEY_CLOSEBRACKET)
		'scale:/60
		scale:-.00005
	EndIf

			
	If KeyDown(KEY_RIGHT)
		CX:+.005
	Else If KeyDown(KEY_LEFT)
		CX:-.005
	EndIf
	If KeyDown(KEY_DOWN)
		CY:+.005
	Else If KeyDown(KEY_UP)
		CY:-.005
	EndIf
	
	If Not in Then
		outMandelbrot(scale,CX,CY,iwidth,iheight,24,isize,-180,-120)
	Else
		inMandelbrot(scale,CX,CY,iwidth/2,iheight/2,24,isize+1)
	EndIf 
	
	
	SetColor(0,0,0)
	DrawText("CX="+CX+" CY="+CY+" Scale="+scale,12,12)
	DrawText("TAB - Toggle Color Cycle",12,27)
	DrawText("SPACE - Toggle IN/OUT Set",12,42)
	DrawText("1,2,3 - Select Color Set",12,57)
	DrawText("UP/DOWN - Change CY",12,72)
	DrawText("LEFT/RIGHT - Change CX",12,87)
	DrawText("[/] - Zoom",12,102)
	
	SetColor(255,255,255)
	DrawText("CX="+CX+" CY="+CY+" Scale="+scale,10,10)
	DrawText("TAB - Toggle Color Cycle",10,25)
	DrawText("SPACE - Toggle IN/OUT Set",10,40)
	DrawText("1,2,3 - Select Color Set",10,55)
	DrawText("UP/DOWN - Change CY",10,70)
	DrawText("LEFT/RIGHT - Change CX",10,85)
	DrawText("[/] - Zoom",10,100)
	
	Flip 
Wend

Function colorCycle()
	If CCycle=False Then Return
	Local cc:Int = colors.dimensions()[0]
	Local r:Int = colors[cc-1,0]
	Local g:Int = colors[cc-1,1]
	Local b:Int = colors[cc-1,2]
	For Local i:Int=cc-1 Until 0 Step -1
		colors[i,0]=colors[i-1,0]
		colors[i,1]=colors[i-1,1]
		colors[i,2]=colors[i-1,2]
	Next
	colors[0,0]=r
	colors[0,1]=g
	colors[0,2]=b
End Function

Function createColors(set:Byte)
	Select(set)
	Case 0
	'Rem grey shades
	'------------------------------------
	colors=New Int[256,3]
	For Local ci:Int = 0 Until 256
		colors[ci,0]=ci
		colors[ci,1]=ci
		colors[ci,2]=ci
	Next
	'EndRem
	Case 1
	'Rem darks to lights
	'------------------------------------
	colors=New Int[768,3]
	For Local ci:Int = 0 Until 256
		colors[ci,0]=ci
		colors[ci,1]=0
		colors[ci,2]=0
		colors[ci+256,0]=0
		colors[ci+256,1]=ci
		colors[ci+256,2]=0
		colors[ci+512,0]=0
		colors[ci+512,1]=0
		colors[ci+512,2]=ci
	Next
	'EndRem
	Case 2
	'Rem mid to light to mid
	'------------------------------------
	colors=New Int[768,3]
	For Local ci:Int = 0 Until 128
		colors[ci,0]=ci+128
		colors[ci,1]=0
		colors[ci,2]=0
		colors[ci+256,0]=0
		colors[ci+256,1]=ci+128
		colors[ci+256,2]=0
		colors[ci+512,0]=0
		colors[ci+512,1]=0
		colors[ci+512,2]=ci+128
	Next
	For Local ci:Int = 128 Until 256
		colors[ci,0]=256-ci+128
		colors[ci,1]=0
		colors[ci,2]=0
		colors[ci+256,0]=0
		colors[ci+256,1]=256-ci+128
		colors[ci+256,2]=0
		colors[ci+512,0]=0
		colors[ci+512,1]=0
		colors[ci+512,2]=256-ci+128
	Next
	'EndRem
	End Select
End Function

Function inMandelbrot(scale:Double,CX:Double,CY:Double,WIDTH:Int,HEIGHT:Int,Detail:Int,size:Int,xoff:Int=0,yoff:Int=0)
	SetOrigin(xoff,yoff)
	Local HALF_WIDTH:Double = WIDTH/2
	Local HALF_HEIGHT:Double = HEIGHT/2
	Local QUAR_WIDTH:Double = WIDTH/4
	Local QUAR_HEIGHT:Double = HEIGHT/4
	For Local PixelY:Int = -HALF_HEIGHT To HALF_HEIGHT
		For Local PixelX:Int = -HALF_WIDTH To HALF_WIDTH
	    	Local ZX:Double = CX+PixelX*scale
	    	Local ZY:Double = CY+PixelY*scale
			Local OldZX:Double = ZX
			Local OldZY:Double = ZY
	    	For Local i:Int = 0 To Detail
				Local NewZX:Double = (OldZX*OldZX)-(OldZY*OldZY)+ZX
				Local NewZY:Double = ((2*OldZX)*OldZY)+ZY
		      	OldZX = NewZX
		      	OldZY = NewZY
				Local DISTANCE:Double = (OldZX*OldZX) + (OldZY*OldZY)
		      	If DISTANCE > 4 Then 
					DISTANCE=4/DISTANCE * (colors.dimensions()[0]-1)
					SetColor(colors[DISTANCE,0],colors[DISTANCE,1],colors[DISTANCE,2])
					DrawRect((pixelx+HALF_WIDTH)*size,(pixely+HALF_HEIGHT)*size,size,size)
					Exit ' Go to nextpoint
				EndIf
    		Next
		Next 
	Next
	SetOrigin(0,0)
End Function

Function outMandelbrot(scale:Double,CX:Double,CY:Double,WIDTH:Int,HEIGHT:Int,Detail:Int,size:Int,xoff:Int=0,yoff:Int=0)
	SetOrigin(xoff,yoff)
	Local HALF_WIDTH:Double = WIDTH/2
	Local HALF_HEIGHT:Double = HEIGHT/2
	Local QUAR_WIDTH:Double = WIDTH/4
	Local QUAR_HEIGHT:Double = HEIGHT/4
	For Local PixelY:Int = -HALF_HEIGHT To HALF_HEIGHT
		For Local PixelX:Int = -HALF_WIDTH To HALF_WIDTH
	    	Local ZX:Double = CX+PixelX*scale
	    	Local ZY:Double = CY+PixelY*scale
			Local OldZX:Double = ZX
			Local OldZY:Double = ZY
			Local DISTANCE:Double = 0 
	    	For Local i:Int = 0 To Detail
				Local NewZX:Double = (OldZX*OldZX)-(OldZY*OldZY)+ZX
				Local NewZY:Double = ((2*OldZX)*OldZY)+ZY
		      	OldZX = NewZX
		      	OldZY = NewZY
				DISTANCE = (OldZX*OldZX) + (OldZY*OldZY)
		      	If DISTANCE > 4 Then Exit
			Next
	      	If DISTANCE < 4 Then 
				If DISTANCE>1 Then DISTANCE=1
				DISTANCE=DISTANCE * (colors.dimensions()[0]-1)
				SetColor(colors[DISTANCE,0],colors[DISTANCE,1],colors[DISTANCE,2])
				DrawRect((pixelx+HALF_WIDTH)*size,(pixely+HALF_HEIGHT)*size,size,size)
			EndIf
		Next 
	Next
	SetOrigin(0,0)
End Function



I've ordered two books:

Fractals for the Classroom : Part 1: Introduction to Fractals and Chaos (Hardcover)

Fractals for the Classroom : Part Two: Complex Systems and Mandelbrot Set (Fractals for the Classroom)


Does anyone have these? I got them on Amazon used for a really good price, I'm hoping they are better than other fractal books I've bought/looked at.

Lovely - now can we have those in Blitz3D code?

here is a partial conversion for the julia code, the rest is left as an excersize for the reader.

Graphics 640,480
SetBuffer BackBuffer()

; Simple Program To Display The Julia Set
CX# = .344999
CY# = .074999
CCycle = False
in = False
Dim colors(256,3)
createColors(0)
iwidth = 320
iheight = 240
isize = 3

While Not KeyHit(KEY_ESCAPE)
	Cls
	If KeyHit(KEY_1)
		createColors(0)
	ElseIf KeyHit(KEY_2)
		createColors(1)
	ElseIf KeyHit(KEY_3)
		createColors(2)
	EndIf
	
	If KeyHit(KEY_TAB)
		CCycle = Not CCycle
	EndIf
	If KeyHit(KEY_SPACE)
		in = Not in
	EndIf
	
	colorCycle()

	If KeyDown(KEY_RIGHT)
		CX=CX+.0005
	ElseIf KeyDown(KEY_LEFT)
		CX=CX-.0005
	EndIf
	If KeyDown(KEY_DOWN)
		CY=CY+.0005
	ElseIf KeyDown(KEY_UP)
		CY=CY-.0005
	EndIf
	
	If Not in Then
		outJulia(CX,CY,iwidth,iheight,24,isize,-iwidth/2,-iheight/2)
	Else
		inJulia(CX,CY,iwidth/2,iheight/2,24,isize+1,0,0)
	EndIf 
	
	
	Color(0,0,0)
	Text(12,12,"CX="+CX+" CY="+CY)
	Text(12,27,"TAB - Toggle Color Cycle")
	Text(12,42,"SPACE - Toggle IN/OUT Set")
	Text(12,57,"1,2,3 - Select Color Set")
	Text(12,72,"UP/DOWN - Change CY")
	Text(12,87,"LEFT/RIGHT - Change CX")
	
	Color(255,255,255)
	Text(10,10,"CX="+CX+" CY="+CY)
	Text(10,25,"TAB - Toggle Color Cycle")
	Text(10,40,"SPACE - Toggle IN/OUT Set")
	Text(10,55,"1,2,3 - Select Color Set")
	Text(10,70,"UP/DOWN - Change CY")
	Text(10,85,"LEFT/RIGHT - Change CX")
	
	Flip 
Wend

Function colorCycle()
	If CCycle=False Then Return
	cc = 256
	r = colors(cc-1,0)
	g = colors(cc-1,1)
	b = colors(cc-1,2)
	For i=cc-1 To 1 Step -1
		colors(i,0)=colors(i-1,0)
		colors(i,1)=colors(i-1,1)
		colors(i,2)=colors(i-1,2)
	Next
	colors(0,0)=r
	colors(0,1)=g
	colors(0,2)=b
End Function

Function createColors(set)
	For ci = 0 To 255
		colors(ci,0)=ci
		colors(ci,1)=ci
		colors(ci,2)=ci
	Next
End Function

Function inJulia(CX#,CY#,WIDTH,HEIGHT,Detail,size,xoff,yoff)
	HALF_WIDTH# = WIDTH/2
	HALF_HEIGHT# = HEIGHT/2
	QUAR_WIDTH# = WIDTH/4
	QUAR_HEIGHT# = HEIGHT/4
	For PixelY = 0 To HEIGHT
		For PixelX = 0 To WIDTH
		    	ZX# = ((PixelX - HALF_WIDTH) / QUAR_WIDTH)
		    	ZY# = ((PixelY - HALF_HEIGHT) / QUAR_HEIGHT)
		    	For i = 0 To Detail
			      	NewZX# = (ZX * ZX) - (ZY * ZY) + CX
			      	NewZY# = ((2 * ZX) * ZY) + CY
			      	ZX = NewZX
			      	ZY = NewZY
				DISTANCE# = (ZX*ZX) + (ZY*ZY)
			      	If DISTANCE > 4 Then 
					DISTANCE=4/DISTANCE * (255)
					Color(colors(DISTANCE,0),colors(DISTANCE,1),colors(DISTANCE,2))
					Rect((pixelx)*size,(pixely)*size,size,size)
					Exit ;' Go To nextpoint
				EndIf
	    		Next
		Next 
	Next
End Function

Function outJulia(CX#,CY#,WIDTH,HEIGHT,Detail,size,xoff,yoff)
	HALF_WIDTH# = WIDTH/2
	HALF_HEIGHT# = HEIGHT/2
	QUAR_WIDTH# = WIDTH/4
	QUAR_HEIGHT# = HEIGHT/4
	For PixelY = 0 To HEIGHT
		For PixelX = 0 To WIDTH
		    	ZX# = (PixelX - HALF_WIDTH) / QUAR_WIDTH
		    	ZY# = (PixelY - HALF_HEIGHT) / QUAR_HEIGHT
			DISTANCE# = 0 
			For i = 0 To Detail
			      	NewZX# = (ZX * ZX) - (ZY * ZY) + CX
			      	NewZY# = ((2 * ZX) * ZY) + CY
			      	ZX = NewZX
			      	ZY = NewZY
				DISTANCE = (ZX*ZX) + (ZY*ZY)
			      	If DISTANCE > 4 Then Exit ; Go To nextpoint
	    		Next
			If DISTANCE<4 Then
				If DISTANCE>1 Then DISTANCE=1
				DISTANCE=DISTANCE * (255)
				Color(colors(DISTANCE,0),colors(DISTANCE,1),colors(DISTANCE,2))
				Rect(pixelx*size,pixely*size,size,size)
			EndIf
		Next 
	Next
End Function