Py.Cafe

maartenbreddels/

solara-ipycanvas-fractal-tree

Fractal Tree Generator using Solara and Ipycanvas

DocsPricing
  • app.py
  • requirements.txt
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# 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])
requirements.txt
1
2
solara
ipycanvas