{ "metadata": { "kernelspec": { "display_name": "xeus-python", "language": "python", "name": "xeus-python" }, "language_info": { "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "version": "3.10.2" } }, "nbformat_minor": 4, "nbformat": 4, "cells": [ { "cell_type": "code", "source": "from math import pi\nfrom random import uniform\n\nfrom ipywidgets import Button\n\nfrom ipycanvas import Canvas, hold_canvas", "metadata": { "trusted": true }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": "canvas = Canvas(width=800, height=600)", "metadata": { "trusted": true }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": "def recursive_draw_leaf(canvas, length, r_angle, r_factor, l_angle, l_factor):\n canvas.stroke_line(0, 0, 0, -length)\n canvas.translate(0, -length)\n\n if length > 5:\n canvas.save()\n\n canvas.rotate(r_angle)\n recursive_draw_leaf(\n canvas, length * r_factor, r_angle, r_factor, l_angle, l_factor\n )\n\n canvas.restore()\n\n canvas.save()\n\n canvas.rotate(l_angle)\n recursive_draw_leaf(\n canvas, length * l_factor, r_angle, r_factor, l_angle, l_factor\n )\n\n canvas.restore()", "metadata": { "trusted": true }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": "def draw_tree(canvas):\n with hold_canvas():\n canvas.save()\n\n canvas.clear()\n canvas.fill_style = 'white'\n canvas.fill_rect(0, 0, canvas.width, canvas.height)\n\n canvas.translate(canvas.width / 2.0, canvas.height)\n\n canvas.stroke_style = \"black\"\n\n r_factor = uniform(0.6, 0.8)\n l_factor = uniform(0.6, 0.8)\n\n r_angle = uniform(pi / 10.0, pi / 5.0)\n l_angle = uniform(-pi / 5.0, -pi / 10.0)\n\n recursive_draw_leaf(canvas, 150, r_angle, r_factor, l_angle, l_factor)\n\n canvas.restore()", "metadata": { "trusted": true }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": "button = Button(description=\"Generate tree!\")\n\n\ndef click_callback(*args, **kwargs):\n global canvas\n\n draw_tree(canvas)\n\n\nbutton.on_click(click_callback)", "metadata": { "trusted": true }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": "draw_tree(canvas)", "metadata": { "trusted": true }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": "canvas", "metadata": { "trusted": true }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": "button", "metadata": { "trusted": true }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": "## Acknowledgment:\n\nThis Notebook is adapted from a Notebook by [Eric MADEC](https://github.com/ericecmorlaix) which was itself adapted from https://medium.com/better-programming/learning-p5-js-by-making-fractals-cbdcac5c651e", "metadata": {} } ] }