Spaces:
Running
Running
#!/usr/bin/env python3 | |
""" xturtle-example-suite: | |
xtx_kites_and_darts.py | |
Constructs two aperiodic penrose-tilings, | |
consisting of kites and darts, by the method | |
of inflation in six steps. | |
Starting points are the patterns "sun" | |
consisting of five kites and "star" | |
consisting of five darts. | |
For more information see: | |
http://en.wikipedia.org/wiki/Penrose_tiling | |
------------------------------------------- | |
""" | |
from turtle import * | |
from math import cos, pi | |
from time import perf_counter as clock, sleep | |
f = (5**0.5-1)/2.0 # (sqrt(5)-1)/2 -- golden ratio | |
d = 2 * cos(3*pi/10) | |
def kite(l): | |
fl = f * l | |
lt(36) | |
fd(l) | |
rt(108) | |
fd(fl) | |
rt(36) | |
fd(fl) | |
rt(108) | |
fd(l) | |
rt(144) | |
def dart(l): | |
fl = f * l | |
lt(36) | |
fd(l) | |
rt(144) | |
fd(fl) | |
lt(36) | |
fd(fl) | |
rt(144) | |
fd(l) | |
rt(144) | |
def inflatekite(l, n): | |
if n == 0: | |
px, py = pos() | |
h, x, y = int(heading()), round(px,3), round(py,3) | |
tiledict[(h,x,y)] = True | |
return | |
fl = f * l | |
lt(36) | |
inflatedart(fl, n-1) | |
fd(l) | |
rt(144) | |
inflatekite(fl, n-1) | |
lt(18) | |
fd(l*d) | |
rt(162) | |
inflatekite(fl, n-1) | |
lt(36) | |
fd(l) | |
rt(180) | |
inflatedart(fl, n-1) | |
lt(36) | |
def inflatedart(l, n): | |
if n == 0: | |
px, py = pos() | |
h, x, y = int(heading()), round(px,3), round(py,3) | |
tiledict[(h,x,y)] = False | |
return | |
fl = f * l | |
inflatekite(fl, n-1) | |
lt(36) | |
fd(l) | |
rt(180) | |
inflatedart(fl, n-1) | |
lt(54) | |
fd(l*d) | |
rt(126) | |
inflatedart(fl, n-1) | |
fd(l) | |
rt(144) | |
def draw(l, n, th=2): | |
clear() | |
l = l * f**n | |
shapesize(l/100.0, l/100.0, th) | |
for k in tiledict: | |
h, x, y = k | |
setpos(x, y) | |
setheading(h) | |
if tiledict[k]: | |
shape("kite") | |
color("black", (0, 0.75, 0)) | |
else: | |
shape("dart") | |
color("black", (0.75, 0, 0)) | |
stamp() | |
def sun(l, n): | |
for i in range(5): | |
inflatekite(l, n) | |
lt(72) | |
def star(l,n): | |
for i in range(5): | |
inflatedart(l, n) | |
lt(72) | |
def makeshapes(): | |
tracer(0) | |
begin_poly() | |
kite(100) | |
end_poly() | |
register_shape("kite", get_poly()) | |
begin_poly() | |
dart(100) | |
end_poly() | |
register_shape("dart", get_poly()) | |
tracer(1) | |
def start(): | |
reset() | |
ht() | |
pu() | |
makeshapes() | |
resizemode("user") | |
def test(l=200, n=4, fun=sun, startpos=(0,0), th=2): | |
global tiledict | |
goto(startpos) | |
setheading(0) | |
tiledict = {} | |
tracer(0) | |
fun(l, n) | |
draw(l, n, th) | |
tracer(1) | |
nk = len([x for x in tiledict if tiledict[x]]) | |
nd = len([x for x in tiledict if not tiledict[x]]) | |
print("%d kites and %d darts = %d pieces." % (nk, nd, nk+nd)) | |
def demo(fun=sun): | |
start() | |
for i in range(8): | |
a = clock() | |
test(300, i, fun) | |
b = clock() | |
t = b - a | |
if t < 2: | |
sleep(2 - t) | |
def main(): | |
#title("Penrose-tiling with kites and darts.") | |
mode("logo") | |
bgcolor(0.3, 0.3, 0) | |
demo(sun) | |
sleep(2) | |
demo(star) | |
pencolor("black") | |
goto(0,-200) | |
pencolor(0.7,0.7,1) | |
write("Please wait...", | |
align="center", font=('Arial Black', 36, 'bold')) | |
test(600, 8, startpos=(70, 117)) | |
return "Done" | |
if __name__ == "__main__": | |
msg = main() | |
mainloop() | |