Here is a little program I built last night for playing with Julia sets.
http://www.scottshaver2000.com/blitz/demo6/julia1.exe
http://www.scottshaver2000.com/blitz/demo6/julia1.exe
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
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
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