summaryrefslogtreecommitdiffstats
path: root/Lib/turtledemo/bytedesign.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/turtledemo/bytedesign.py')
-rw-r--r--Lib/turtledemo/bytedesign.py162
1 files changed, 162 insertions, 0 deletions
diff --git a/Lib/turtledemo/bytedesign.py b/Lib/turtledemo/bytedesign.py
new file mode 100644
index 0000000..96118b3
--- /dev/null
+++ b/Lib/turtledemo/bytedesign.py
@@ -0,0 +1,162 @@
+#!/usr/bin/env python3
+""" turtle-example-suite:
+
+ tdemo_bytedesign.py
+
+An example adapted from the example-suite
+of PythonCard's turtle graphcis.
+
+It's based on an article in BYTE magazine
+Problem Solving with Logo: Using Turtle
+Graphics to Redraw a Design
+November 1982, p. 118 - 134
+
+-------------------------------------------
+
+Due to the statement
+
+t.delay(0)
+
+in line 152, which sets the animation delay
+to 0, this animation runs in "line per line"
+mode as fast as possible.
+"""
+
+import math
+from turtle import Turtle, mainloop
+from time import clock
+
+# wrapper for any additional drawing routines
+# that need to know about each other
+class Designer(Turtle):
+
+ def design(self, homePos, scale):
+ self.up()
+ for i in range(5):
+ self.forward(64.65 * scale)
+ self.down()
+ self.wheel(self.position(), scale)
+ self.up()
+ self.backward(64.65 * scale)
+ self.right(72)
+ self.up()
+ self.goto(homePos)
+ self.right(36)
+ self.forward(24.5 * scale)
+ self.right(198)
+ self.down()
+ self.centerpiece(46 * scale, 143.4, scale)
+ self.getscreen().tracer(True)
+
+ def wheel(self, initpos, scale):
+ self.right(54)
+ for i in range(4):
+ self.pentpiece(initpos, scale)
+ self.down()
+ self.left(36)
+ for i in range(5):
+ self.tripiece(initpos, scale)
+ self.left(36)
+ for i in range(5):
+ self.down()
+ self.right(72)
+ self.forward(28 * scale)
+ self.up()
+ self.backward(28 * scale)
+ self.left(54)
+ self.getscreen().update()
+
+ def tripiece(self, initpos, scale):
+ oldh = self.heading()
+ self.down()
+ self.backward(2.5 * scale)
+ self.tripolyr(31.5 * scale, scale)
+ self.up()
+ self.goto(initpos)
+ self.setheading(oldh)
+ self.down()
+ self.backward(2.5 * scale)
+ self.tripolyl(31.5 * scale, scale)
+ self.up()
+ self.goto(initpos)
+ self.setheading(oldh)
+ self.left(72)
+ self.getscreen().update()
+
+ def pentpiece(self, initpos, scale):
+ oldh = self.heading()
+ self.up()
+ self.forward(29 * scale)
+ self.down()
+ for i in range(5):
+ self.forward(18 * scale)
+ self.right(72)
+ self.pentr(18 * scale, 75, scale)
+ self.up()
+ self.goto(initpos)
+ self.setheading(oldh)
+ self.forward(29 * scale)
+ self.down()
+ for i in range(5):
+ self.forward(18 * scale)
+ self.right(72)
+ self.pentl(18 * scale, 75, scale)
+ self.up()
+ self.goto(initpos)
+ self.setheading(oldh)
+ self.left(72)
+ self.getscreen().update()
+
+ def pentl(self, side, ang, scale):
+ if side < (2 * scale): return
+ self.forward(side)
+ self.left(ang)
+ self.pentl(side - (.38 * scale), ang, scale)
+
+ def pentr(self, side, ang, scale):
+ if side < (2 * scale): return
+ self.forward(side)
+ self.right(ang)
+ self.pentr(side - (.38 * scale), ang, scale)
+
+ def tripolyr(self, side, scale):
+ if side < (4 * scale): return
+ self.forward(side)
+ self.right(111)
+ self.forward(side / 1.78)
+ self.right(111)
+ self.forward(side / 1.3)
+ self.right(146)
+ self.tripolyr(side * .75, scale)
+
+ def tripolyl(self, side, scale):
+ if side < (4 * scale): return
+ self.forward(side)
+ self.left(111)
+ self.forward(side / 1.78)
+ self.left(111)
+ self.forward(side / 1.3)
+ self.left(146)
+ self.tripolyl(side * .75, scale)
+
+ def centerpiece(self, s, a, scale):
+ self.forward(s); self.left(a)
+ if s < (7.5 * scale):
+ return
+ self.centerpiece(s - (1.2 * scale), a, scale)
+
+def main():
+ t = Designer()
+ t.speed(0)
+ t.hideturtle()
+ t.getscreen().delay(0)
+ t.getscreen().tracer(0)
+ at = clock()
+ t.design(t.position(), 2)
+ et = clock()
+ return "runtime: %.2f sec." % (et-at)
+
+if __name__ == '__main__':
+ msg = main()
+ print(msg)
+ mainloop()