File: trees.py

package info (click to toggle)
pythoncard 0.8.2-2
  • links: PTS
  • area: main
  • in suites: wheezy
  • size: 8,452 kB
  • sloc: python: 56,787; makefile: 56; sh: 22
file content (121 lines) | stat: -rw-r--r-- 3,364 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# examples derived from
# Visual Modeling with Logo: A Structural Approach to Seeing
# by James Clayson
# and
# Turtle Geometry: The Computer as a Medium for Exploring Mathematics
# by Harold Abelson and Andrea diSessa

import wrappers
from random import uniform

class TreesTurtle(wrappers.Turtle):
    # TG p. 85
    def node(self, length, angle, level):
        if level == 0: return
        # point along left branch and draw it
        self.left(angle)
        self.lbranch(length, angle, level - 1)
        # draw right branch
        self.right(2 * angle)
        self.rbranch(length, angle, level - 1)
        # make node state-transparent
        self.left(angle)

    # TG p. 84
    def lbranch(self, length, angle, level):
        # draw a long stem
        self.forward(2 * length)
        # do next level
        self.node(length, angle, level)
        # make lbranch state-transparent
        self.back (2 * length)

    # TG p. 84
    def rbranch(self, length, angle, level):
        # draw a short stem
        self.forward(length)
        # do next level
        self.node(length, angle, level)
        # make lbranch state-transparent
        self.back (length)

    # VM p. 292
    def tree(self, a, b, n, t, bt, f, l):
        if l < 1: return
        pos = self.getXY()
        self.fd(a)
        self.rt(t)
        for i in range(n):
            pos2 = self.getXY()
            self.fd(b)
            self.tree(a * f, b * f, n, t, bt, f, l - 1)
            #self.bk(b)
            self.setXY(pos2)
            self.lt(bt)
        self.rt((n * bt) - t)
        #self.moveTo(pos[0], pos[1])
        self.setXY(pos)
        #self.bk(a)

    # VM p. 306
    def randTree(self, a, n, t, bt, f, l):
        # to draw multiply branched recursive trees
        # with randomized components
        if l < 1: return
        # save the current position and angle
        pos = self.getXY()
        heading = self.getHeading()
        self.fd(uniform(0.5 * a, 1.5 * a))
        self.rt(uniform(0.5 * t, 1.5 * t))
        #self.fd(uniform(0.5 * t, 1.5 * t))
        for i in range(n):
            d = uniform(0.5 * a / 2, 1.5 * a / 2)
            # save the position (not the heading)
            pos2 = self.getXY()
            self.fd(d)
            self.randTree(a * f, n, t, bt, f, l - 1)
            # restore the position
            self.setXY(pos2)
            self.lt(uniform(0.5 * bt, 1.5 * bt))
        # restore the saved position and heading
        self.setXY(pos)
        self.setHeading(heading)

    def testTree(self, size):
        if size < 5: return
        self.fd(size)
        self.lt(30)
        self.testTree(size * .7)
        self.rt(60)
        self.testTree(size * .7)
        self.lt(30)
        self.bk(size)

    def testRTree(self, size):
        if size < 5: return
        self.fd(size)
        self.lt(30)
        self.testRTree(size * ((uniform(1, 5) + 5) / 10))
        self.rt(60)
        self.testRTree(size * ((uniform(1, 5) + 5) / 10))
        self.lt(30)
        self.bk(size)


def draw(canvas):
    t = TreesTurtle(canvas)
    t.cls()
    t.left(90)

    #t.tree(80, 40, 4, 60, 30, .6, 5)
    #t.randTree(50, 3, 60, 30, .6, 4)
    #t.randTree(30, 3, 30, 30, .75, 5)
    #t.randTree(30, 3, 30, 15, .9, 5)

    t.pu()
    t.bk(150)
    t.pd()
    #t.testTree(75)
    t.testRTree(50)

    #t.lbranch(20, 20, 7)