import Blender
from Blender import NMesh

  # Quelques fonctions du module mathematiques de  Python
  # peuvent se reveler utiles,  le python, grand econome,
  # ne charge que le strict minimum lorsqu'il est sollicite
  # il est necessaire de demander le reste...
import math
from math import *

  # Creation du reseau de polygones
me=NMesh.GetRaw()

  # Sans aborder le probleme des variables locales
  # et des variables globales il vaut mieux (je prefere
  # mais tout bon programmeur vous dira qu'il faut ne
  # faut surtout pas le faire)  declarer les 
  # compteurs en dehors des sous-programmes 
i=0.0
j=0.0

  #  Les strictes conditions du didacticiel
  # on range la valeur 9 dans une variable maxpoint
maxpoint=48.0**2

  # On applique systematiquement:
  # on tire la racine carre de maxpoint avec 
  # la fonction sqrt()
n=sqrt(maxpoint)
print n

u=0.0
v=0.0

a=0.0

for i in range(0,n):
      # Ici commence le premier sous-programme
      # quatre espaces d'indentation
    print i
   
    for j in range(0,n):
          # Ici commence la seconde boucle
          # huit espaces d'indentation
        print j
        
        u=i*-pi/1.227/n
        v=j*pi/1.22/n
        a=1.50
        
        x = (a+cos((u*u)/2)*sin(v*v)-sin((u*u)/2)*sin(2*(v*v)))*cos(u*u)
        y = (a+cos((u*u)/2)*sin(v*v)-sin((u*u)/2)*sin(2*(v*v)))*sin(u*u)
        z = (sin((u*u)/2)*sin(v*v)+cos((u*u)/2)*sin(2*v*v))


        v=NMesh.Vert(x,y,z)
        me.verts.append(v)
        # Fin de la boucle interne
    #Fin de la boucle externe


#valeur entiere de n
n0=len(range(0,n))
print n0

for i in range(0,n-1):  
    # Ici commence le premier sous-programme  
    # quatre espaces d'indentation  
    for j in range(0,n-1):  
        # Ici commence la seconde boucle  
        # huit espaces d'indentation  
        f=NMesh.Face()  
        f.v.append(me.verts[i*n0+j])  
        f.v.append(me.verts[i*n0+j+1])  
        f.v.append(me.verts[(i+1)*n0+j+1])  
        f.v.append(me.verts[(i+1)*n0+j]) 
        # Apres avoir complete a facette 
        # on l'ajoute à la liste de "me" 
        me.faces.append(f) 
        # Fin de la boucle interne  
    #Fin de la boucle externe  
	

NMesh.PutRaw(me,"plane",1)  
Blender.Redraw()