from math import pi
from random import uniform
from ipywidgets import Button
from ipycanvas import Canvas, hold_canvas
canvas = Canvas(width=800, height=600)
def recursive_draw_leaf(canvas, length, r_angle, r_factor, l_angle, l_factor):
canvas.stroke_line(0, 0, 0, -length)
canvas.translate(0, -length)
if length > 5:
canvas.save()
canvas.rotate(r_angle)
recursive_draw_leaf(
canvas, length * r_factor, r_angle, r_factor, l_angle, l_factor
)
canvas.restore()
canvas.save()
canvas.rotate(l_angle)
recursive_draw_leaf(
canvas, length * l_factor, r_angle, r_factor, l_angle, l_factor
)
canvas.restore()
def draw_tree(canvas):
with hold_canvas():
canvas.save()
canvas.clear()
canvas.fill_style = 'white'
canvas.fill_rect(0, 0, canvas.width, canvas.height)
canvas.translate(canvas.width / 2.0, canvas.height)
canvas.stroke_style = "black"
r_factor = uniform(0.6, 0.8)
l_factor = uniform(0.6, 0.8)
r_angle = uniform(pi / 10.0, pi / 5.0)
l_angle = uniform(-pi / 5.0, -pi / 10.0)
recursive_draw_leaf(canvas, 150, r_angle, r_factor, l_angle, l_factor)
canvas.restore()
button = Button(description="Generate tree!")
def click_callback(*args, **kwargs):
global canvas
draw_tree(canvas)
button.on_click(click_callback)
draw_tree(canvas)
canvas
button
This Notebook is adapted from a Notebook by Eric MADEC which was itself adapted from https://medium.com/better-programming/learning-p5-js-by-making-fractals-cbdcac5c651e