symbian-qemu-0.9.1-12/python-2.6.1/Demo/turtle/tdemo_fractalcurves.py
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 #!/usr/bin/python
       
     2 """      turtle-example-suite:
       
     3 
       
     4         tdemo_fractalCurves.py
       
     5 
       
     6 This program draws two fractal-curve-designs:
       
     7 (1) A hilbert curve (in a box)
       
     8 (2) A combination of Koch-curves.
       
     9 
       
    10 The CurvesTurtle class and the fractal-curve-
       
    11 methods are taken from the PythonCard example
       
    12 scripts for turtle-graphics.
       
    13 """
       
    14 from turtle import *
       
    15 from time import sleep, clock
       
    16 
       
    17 class CurvesTurtle(Pen):
       
    18     # example derived from
       
    19     # Turtle Geometry: The Computer as a Medium for Exploring Mathematics
       
    20     # by Harold Abelson and Andrea diSessa
       
    21     # p. 96-98
       
    22     def hilbert(self, size, level, parity):
       
    23         if level == 0:
       
    24             return
       
    25         # rotate and draw first subcurve with opposite parity to big curve
       
    26         self.left(parity * 90)
       
    27         self.hilbert(size, level - 1, -parity)
       
    28         # interface to and draw second subcurve with same parity as big curve
       
    29         self.forward(size)
       
    30         self.right(parity * 90)
       
    31         self.hilbert(size, level - 1, parity)
       
    32         # third subcurve
       
    33         self.forward(size)
       
    34         self.hilbert(size, level - 1, parity)
       
    35         # fourth subcurve
       
    36         self.right(parity * 90)
       
    37         self.forward(size)
       
    38         self.hilbert(size, level - 1, -parity)
       
    39         # a final turn is needed to make the turtle
       
    40         # end up facing outward from the large square
       
    41         self.left(parity * 90)
       
    42 
       
    43     # Visual Modeling with Logo: A Structural Approach to Seeing
       
    44     # by James Clayson
       
    45     # Koch curve, after Helge von Koch who introduced this geometric figure in 1904
       
    46     # p. 146
       
    47     def fractalgon(self, n, rad, lev, dir):
       
    48         import math
       
    49 
       
    50         # if dir = 1 turn outward
       
    51         # if dir = -1 turn inward
       
    52         edge = 2 * rad * math.sin(math.pi / n)
       
    53         self.pu()
       
    54         self.fd(rad)
       
    55         self.pd()
       
    56         self.rt(180 - (90 * (n - 2) / n))
       
    57         for i in range(n):
       
    58             self.fractal(edge, lev, dir)
       
    59             self.rt(360 / n)
       
    60         self.lt(180 - (90 * (n - 2) / n))
       
    61         self.pu()
       
    62         self.bk(rad)
       
    63         self.pd()
       
    64 
       
    65     # p. 146
       
    66     def fractal(self, dist, depth, dir):
       
    67         if depth < 1:
       
    68             self.fd(dist)
       
    69             return
       
    70         self.fractal(dist / 3, depth - 1, dir)
       
    71         self.lt(60 * dir)
       
    72         self.fractal(dist / 3, depth - 1, dir)
       
    73         self.rt(120 * dir)
       
    74         self.fractal(dist / 3, depth - 1, dir)
       
    75         self.lt(60 * dir)
       
    76         self.fractal(dist / 3, depth - 1, dir)
       
    77 
       
    78 def main():
       
    79     ft = CurvesTurtle()
       
    80 
       
    81     ft.reset()
       
    82     ft.speed(0)
       
    83     ft.ht()
       
    84     ft.tracer(1,0)
       
    85     ft.pu()
       
    86 
       
    87     size = 6
       
    88     ft.setpos(-33*size, -32*size)
       
    89     ft.pd()
       
    90 
       
    91     ta=clock()
       
    92     ft.fillcolor("red")
       
    93     ft.fill(True)
       
    94     ft.fd(size)
       
    95 
       
    96     ft.hilbert(size, 6, 1)
       
    97 
       
    98     # frame
       
    99     ft.fd(size)
       
   100     for i in range(3):
       
   101         ft.lt(90)
       
   102         ft.fd(size*(64+i%2))
       
   103     ft.pu()
       
   104     for i in range(2):
       
   105         ft.fd(size)
       
   106         ft.rt(90)
       
   107     ft.pd()
       
   108     for i in range(4):
       
   109         ft.fd(size*(66+i%2))
       
   110         ft.rt(90)
       
   111     ft.fill(False)
       
   112     tb=clock()
       
   113     res =  "Hilbert: %.2fsec. " % (tb-ta)
       
   114 
       
   115     sleep(3)
       
   116 
       
   117     ft.reset()
       
   118     ft.speed(0)
       
   119     ft.ht()
       
   120     ft.tracer(1,0)
       
   121 
       
   122     ta=clock()
       
   123     ft.color("black", "blue")
       
   124     ft.fill(True)
       
   125     ft.fractalgon(3, 250, 4, 1)
       
   126     ft.fill(True)
       
   127     ft.color("red")
       
   128     ft.fractalgon(3, 200, 4, -1)
       
   129     ft.fill(False)
       
   130     tb=clock()
       
   131     res +=  "Koch: %.2fsec." % (tb-ta)
       
   132     return res
       
   133 
       
   134 if __name__  == '__main__':
       
   135     msg = main()
       
   136     print msg
       
   137     mainloop()