from casioplot import *


def focus(coord,Xrange,Yrange):
 valueX,valueY=(Xrange[1]-Xrange[0])/2,(Yrange[1]-Yrange[0])/2
  
 return (coord.real-valueX,coord.real+valueX),(coord.imag-valueY,coord.imag+valueY)

def reshape(length,Xrange,Yrange):
 if length[0]>length[1]:
  mult=length[0]/length[1]
  Xrange=(Xrange[0]*mult,Xrange[1]*mult)
    
 elif length[1]>length[0]:
  mult=length[1]/length[0]
  Xrange=(Yrange[0]*mult,Yrange[1]*mult)
    
 return Xrange,Yrange
    
def linspace(Range,values):
 delta=(Range[1]-Range[0])/values

 return[Range[0]+delta*i for i in range(values)]

def mandelbrot(x,y,maxIteration):
 c,z=(x+y*1j,)*2

 if x<abs(c-0.25)-2*abs(c-0.25)**2+0.25 or abs(c+1)<0.25:
  return 1

 for iteration in range(maxIteration):
  if abs(z)>2:
   return 0

  z=z*z+c

 return 1

def ensembleMandelbrot(Xrange,Yrange,length,maxIteration):
 X,Y=linspace(Xrange,length[0]),linspace(Yrange,length[1])
      
 for pixel in range(length[0]*length[1]):
  if mandelbrot(X[pixel%length[0]],Y[pixel//length[0]],maxIteration):
   set_pixel(pixel%length[0],pixel//length[0],(0,)*3)
   show_screen()


Xrange,Yrange=(-2.019,0.492),(-1.128,1.128)
length=(128,64)
maxIteration=255
coord=-0.7635+0j

Xrange,Yrange=reshape(length,Xrange,Yrange)
Xrange,Yrange=focus(coord,Xrange,Yrange)

ensembleMandelbrot(Xrange,Yrange,length,maxIteration)