{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from math import pi\n", "from random import uniform\n", "\n", "from ipywidgets import Button\n", "\n", "from ipycanvas import Canvas, hold_canvas" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "canvas = Canvas(width=800, height=600)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "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()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def draw_tree(canvas):\n", " with hold_canvas():\n", " canvas.save()\n", "\n", " canvas.clear()\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()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "button = Button(description=\"Generate tree!\")\n", "\n", "\n", "def click_callback(*args, **kwargs):\n", " global canvas\n", "\n", " draw_tree(canvas)\n", "\n", "\n", "button.on_click(click_callback)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "draw_tree(canvas)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "display(canvas)\n", "display(button)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Acknowledgment:\n", "\n", "This 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": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.0" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }