タートルグラフィックス
import io
from IPython.display import SVG
class Logo(object):
def __init__(self, x=0, y=0, w=500, h=300, a=0):
self.script, self.pos, self.angle, self.isdown = io.StringIO(), (0, 0), a - 180, True
self.script.write(("<svg width='{}' height='{}'><rect fill='white' width='{}' height='{}' stroke=" +
"'black'/><path stroke='black' fill='none' d='M {} {} ").format(w, h, w - 1, h - 1, w / 2 + x, h / 2 + y))
def pu(self): self.isdown = False
def pd(self): self.isdown = True
def lt(self, n): self.angle += n
def rt(self, n): self.angle -= n
def fd(self, n):
x = round(math.sin(self.angle * math.pi / 180) * n, 4)
y = round(math.cos(self.angle * math.pi / 180) * n, 4)
self.script.write('{} {} {}'.format('l' if self.isdown else 'm', x, y))
def show(self): return SVG(self.script.getvalue() + "'/></svg>")
logo = Logo(-50, 50, 120, 120, -30)
for i in range(3):
logo.fd(100)
logo.rt(120)
logo.show()
logo = Logo(-50, 50, 120, 120)
for i in range(4):
logo.fd(100)
logo.rt(90)
logo.show()
logo = Logo(-30, 50, 120, 120, -18)
for i in range(5):
logo.fd(100)
logo.rt(144)
logo.show()
logo = Logo(-60, 0, 140, 140)
for i in range(360):
logo.fd(1)
logo.rt(1)
logo.show()
logo = Logo(0, 0, 130, 130)
for i in range(500):
logo.fd(i * 0.02)
logo.rt(10)
logo.show()
logo = Logo(20, 30, 150, 150, 30)
for i in range(3):
for j in range(1, 5):
logo.fd(20 * j)
logo.lt(120)
logo.show()
logo = Logo(-80, 10, 200, 200)
for i in range(12):
logo.fd(40)
logo.rt(120)
logo.fd(20)
logo.rt(60)
logo.fd(65)
logo.rt(150)
logo.show()
logo = Logo(0, 80, 240, 180)
def tree(logo, d, l):
logo.fd(l)
if d:
logo.lt(24)
tree(logo, d - 1, l * 0.9)
logo.rt(48)
tree(logo, d - 1, l * 0.9)
logo.lt(24)
logo.fd(-l)
tree(logo, 7, 30)
logo.show()
logo = Logo(-100, 90, 240, 200, -30)
def nested_triangle(logo, l):
if l > 5:
for i in range(3):
nested_triangle(logo, l / 2)
logo.fd(l)
logo.rt(120)
nested_triangle(logo, 200)
logo.show()
logo = Logo(-60, 50, 280, 180)
def c(logo, l, d):
if not d:
logo.fd(l)
else:
c(logo, l, d - 1)
logo.rt(90)
c(logo, l, d - 1)
logo.lt(90)
c(logo, 4, 10)
logo.show()
logo = Logo(-90, 50, 260, 230, 0)
def koch(logo, d, l):
if not d:
logo.fd(l)
else:
koch(logo, d - 1, l / 3)
logo.lt(60)
koch(logo, d - 1, l / 3)
logo.rt(120)
koch(logo, d - 1, l / 3)
logo.lt(60)
koch(logo, d - 1, l / 3)
for i in range(6):
koch(logo, 3, 100)
logo.rt(60)
logo.show()
logo = Logo(-160, 160, 340, 340)
def hilbert(logo, l, n, r):
if n:
logo.rt(r)
hilbert(logo, l, n - 1, -r)
logo.fd(l)
logo.rt(-r)
hilbert(logo, l, n - 1, r)
logo.fd(l)
hilbert(logo, l, n - 1, r)
logo.rt(-r)
logo.fd(l)
hilbert(logo, l, n - 1, -r)
logo.rt(r)
hilbert(logo, 5, 6, 90)
logo.show()
logo = Logo(-160, 10, 450, 300, 120)
def dragon(logo, l, d, p):
if not d:
logo.fd(l)
else:
dragon(logo, l, d - 1, False)
logo.rt(90 if p else -90)
dragon(logo, l, d - 1, True)
dragon(logo, 3, 13, True)
logo.show()