from casioplot import *


def interpol(*colors):
 colors,delta=[[int(color[i:i+2],16)for i in(0,2,4)]for color in colors],len(colors)-1

 return lambda x:[round(colors[int(x*delta)][i]*(1-(delta*x-int(delta*x)))+colors[int(x*delta)+1][i]*(delta*x-int(delta*x)))for i in[0,1,2]]

def zoom(coord,factor,Xrange,Yrange):
 factor*=2
 valueX,valueY=(Xrange[1]-Xrange[0])/factor,(Yrange[1]-Yrange[0])/factor

 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]
  Yrange=(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,maxIterr):
 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 maxIterr

 for iterr in range(maxIterr):
  if abs(z)>2:
   return iterr

   z=z*z+c

 return maxIterr

def ensembleMandelbrot(Xrange,Yrange,length,maxIterr,palette):
 X,Y=linspace(Xrange,length[0]),linspace(Yrange,length[1])

 for pixel in range(length[0]*length[1]):
  x,y=pixel%length[0],pixel//length[0]
  set_pixel(x,y,palette(mandelbrot(X[x],Y[y],maxIterr)/(maxIterr+1)))
  show_screen()


Xrange,Yrange,length=(-2.019,0.492),(-1.128,1.128),(384,192)
maxIterr=255
coord=-0.7635+0j
palette=interpol("000000","ff000","ffff00","00ff00","00ffff","0000ff","ff00ff","ff0000","000000")

Xrange,Yrange=reshape(length,Xrange,Yrange)
Xrange,Yrange=zoom(coord,1,Xrange,Yrange)

ensembleMandelbrot(Xrange,Yrange,length,maxIterr,palette)
