###################################
#  Zoom in mandelbrot set         #
#                                 #
#           Blender  2.23         #  
#                                 # 
#  jean-michel soler 1999/2002    #
#      revision 2 compatible with #
#      vertex colors              #
#                                 #
###################################
import Blender
from Blender import NMesh, Object
from Blender.NMesh import *
from Blender.Draw import *
from Blender.BGL import *
#from Blender.Const import *
z=0


import math
from math import *

#borne de la zone observee
#--------------------------
Txin=Create(-0.2)
Txax=Create(-0.1)
Tyin=Create(-0.95)	
Tyax=Create(-0.85)

#hauteur de la montagne
#----------------------
Tprop=Create(1.0)

#niveau de precision/ nombre de lignes et de colonnes
#----------------------------------------------------
TdefX=Create(4)
TdefY=Create(4)

#test d'existence du mesh pour animation 
#---------------------------------------
Tanim=Create("NanimePas")
TvAni=Create(0.09)

def mandelbrotZoom(nx,ny,xin,xax,yin,yax,prop):

	me = NMesh.GetRaw()

	px=(xax-xin)/nx
	py=(yax-yin)/ny

	#x=0.0
	#y=0.0

	n01=1.0/float(nx*0.5)
	n02=1.0/float(ny*0.5)

	i0=1.0/400.0

	for y in range(0,ny+1,1):
		for x in range(0,nx+1,1):

			print x,y,

			iter=0.0
			zx=0.0
			zy=0.0
			zz=0.0
			cx=xin+x*px
			cy=yin+y*py

			while ((abs(zx)+abs(zy)<2.0)  and (iter<=400.0)):
				zz = zx*zx-zy*zy+cx
				zy = 2*zx*zy+cy
				zx = zz
				iter = iter+1.0
            
			z = iter*i0
			v=NMesh.Vert(x*n01,y*n02,z*prop)
 
			me.verts.append(v)
    
	for x in range(0,nx):
		for y in range(0,ny):

			f=NMesh.Face()

			f.v.append(me.verts[x+y*(nx+1)])
			f.v.append(me.verts[x+1+y*(nx+1)])
			f.v.append(me.verts[x+1+(y+1)*(nx+1)])
			f.v.append(me.verts[x+(y+1)*(nx+1)])
              
			me.faces.append(f)
	
	NMesh.PutRaw(me,"Plane.002")

	Blender.Redraw()
	

def draw():
	global Txin,Txax,Tyin,Tyax,Tprop,TdefX,TdefY
	glClear(GL_COLOR_BUFFER_BIT)

	#texte titre
	glRasterPos2d(8, 320)
	Text("Zoom 3D sur l'ensemble de mandelbrot")

	#texte commentaire
	glRasterPos2d(8, 295)
	Text("Choisir les limites de zone a traiter x min x max y min y max")
	glRasterPos2d(8, 280)

	Text("Zprp pour agrandir l'elevation, defX pour definir la matrice 2D.")

	#le meme en anglais approximatif
	glRasterPos2d(8, 265)
	Text("Choose zone limits to treat, x min x max y min y max")
	glRasterPos2d(8, 250)
	Text("Zprp for detailling elevation, defx 2D for matrix definition.")

	#bouton glissiaire pour proportion de hauteur
	TdefX=Slider("defX : ", 2, 140, 220, 160, 18, TdefX.val, 2, 200,0)

	#bouton glissiaire pour proportion de hauteur
	TdefY=Slider("defY : ", 2, 140, 202, 160, 18, TdefY.val, 2, 200,0)

	#zonne observée
	Txin=Slider("Xin : ", 2, 140, 160, 160, 18, Txin.val, -2, 0.5,0)
	Txax=Slider("Xax : ", 2, 140, 140, 160, 18, Txax.val, -2, 0.5,0)
	Tyin=Slider("Yin : ", 2, 140, 120, 160, 18, Tyin.val, -1.2, 1.2,0)
	Tyax=Slider("Yax : ", 2, 140, 100, 160, 18, Tyax.val, -1.2, 1.2,0)
	Tprop=Slider("ZPrp : ", 2, 140, 180, 160, 18, Tprop.val, 0.001, 8.0,0)
	
	#boutons de sortie
	Button("Exit", 1, 100, 10, 80, 19)
	#bouton de création de la forme
	Button("Make it", 3, 190, 10, 80, 19)
	

	
def event(evt, val):	
	if (evt== QKEY and not val): Exit()

def bevent(evt):
	global Txin,Txax,Tyin,Tyax,Tprop,TdefX, TvAni,Tanim,TdefY
	if   (evt== 1): Exit()
	elif (evt== 3): 
		mandelbrotZoom(TdefX.val,TdefY.val,Txin.val,Txax.val,Tyin.val,Tyax.val,Tprop.val)
	Blender.Redraw()

Register(draw, event, bevent)




