Fractal - Julia Set

Community Forums/Showcase/Fractal - Julia Set

Scott Shaver(Posted 2006) [#1]
Here is a little program I built last night for playing with Julia sets.

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


Stevie G(Posted 2006) [#2]
Cool wee program mate!


Scott Shaver(Posted 2006) [#3]
Thanks,

here is another for the Mandelbrot set

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


Grey Alien(Posted 2006) [#4]
I love this stuff!


Steven Noyce(Posted 2006) [#5]
Any chance of some code? What program is this made in?


n8r2k(Posted 2006) [#6]
great stuff but the zoom doesnt work on the mandlebrot set


Scott Shaver(Posted 2006) [#7]
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




Scott Shaver(Posted 2006) [#8]
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.


John Blackledge(Posted 2006) [#9]
Lovely - now can we have those in Blitz3D code?


Scott Shaver(Posted 2006) [#10]
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