# original from https://github.com/jupyter-widgets-contrib/ipycanvas?tab=readme-ov-file
from math import pi
from random import uniform
from ipycanvas import Canvas, hold_canvas
import ipycanvas
from ipywidgets import Button, VBox
# in solara, you need to create a canvas manager
canvas = Canvas(width=800, height=600, _canvas_manager=ipycanvas.canvas._CanvasManager())
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)
page = VBox([canvas, button])