#
# la scala del diavolo viene definita in uno
# script python per kig che costruisce un punto
# sulla scala in funzione dell'ascissa del punto
# di controllo
#
# la scala puo' quindi essere disegnata come luogo,
# anche se poi le funzioni di disegno di luoghi non
# sono in grado di riprodurre bene i dettagli ad
# un alto livello di ricorsione
#

OO = Point(0,0,internal=True)
O1 = Point(1,0,internal=True)
vector = Vector(OO,O1,internal=True)

A = Point(0,0)
C = Point(1,1)
invvector = Vector(A,OO,internal=True)
B = Translate(A,vector,HIDDEN)
s = Segment(A,B)
P = ConstrainedPoint(0.5,s)
Q = Translate(P,invvector,internal=True)

script='''def calc( arg1 ):
   def devil(x,n):
      if n == 0: return x
      if x < 1./3.:
         return devil(3*x,n-1)/2.
      if x > 2./3.:
         return 0.5 + devil(3*x-2,n-1)/2.
      return 0.5

   t = arg1.coordinate().x

   y = devil(t,8)
   return Point(Coordinate(t,y))
'''

M = PythonScript(script,[Q])

#
# ora disegniamo la scala come una sequenza di segmenti...
#

def devil(a,b,ax,ay,bx,by,n):
  if n == 0:
    Segment(a,b)
    return
  cy = (ay + by)/2.
  cx = 2./3.*ax + 1./3.*bx;
  dx = 1./3.*ax + 2./3.*bx;
  c = Point(cx,cy,HIDDEN)
  d = Point(dx,cy,HIDDEN)
  Segment(c,d)
  devil(a,c,ax,ay,cx,cy,n-1)
  devil(d,b,dx,cy,bx,by,n-1)

devil(A,C,0.,0.,1.,1.,8)
