Skip to content

Instantly share code, notes, and snippets.

@kvedala
Last active July 2, 2020 15:20
Show Gist options
  • Save kvedala/7cc557bb2f0b30a3a1f8f2b282ac2192 to your computer and use it in GitHub Desktop.
Save kvedala/7cc557bb2f0b30a3a1f8f2b282ac2192 to your computer and use it in GitHub Desktop.
Spirograph
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Spirograph",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"9c9d9431b98341138c706efe57189d28": {
"model_module": "@jupyter-widgets/controls",
"model_name": "VBoxModel",
"state": {
"_view_name": "VBoxView",
"_dom_classes": [
"widget-interact"
],
"_model_name": "VBoxModel",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.5.0",
"box_style": "",
"layout": "IPY_MODEL_6b1b75c93d914023b2bafaec3c8d2ee6",
"_model_module": "@jupyter-widgets/controls",
"children": [
"IPY_MODEL_1822fe1d9ace44c8bf1b2d0643702d69",
"IPY_MODEL_d70bd65c7f794c92ba74258b3bf72dba",
"IPY_MODEL_4a8a24ffd8684a4f8d1f0188335a8b8d",
"IPY_MODEL_c002247f80ba4fc984ee21a06cb52f90",
"IPY_MODEL_eb24991ef5e34b1084036322c4f9f4db"
]
}
},
"6b1b75c93d914023b2bafaec3c8d2ee6": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"1822fe1d9ace44c8bf1b2d0643702d69": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatSliderModel",
"state": {
"_view_name": "FloatSliderView",
"style": "IPY_MODEL_0ad5729b2f2946e8813bfc207d0de6e9",
"_dom_classes": [],
"description": "marker distance from centre of inner circle",
"step": 0.01,
"_model_name": "FloatSliderModel",
"orientation": "horizontal",
"max": 1,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 0.3,
"_view_count": null,
"disabled": false,
"_view_module_version": "1.5.0",
"min": 0,
"continuous_update": true,
"readout_format": ".2f",
"description_tooltip": null,
"readout": true,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_f231488cb2344280bf3bf5916f4838ed"
}
},
"d70bd65c7f794c92ba74258b3bf72dba": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatSliderModel",
"state": {
"_view_name": "FloatSliderView",
"style": "IPY_MODEL_9ef6c899e5ec41aa95593f10022b6af7",
"_dom_classes": [],
"description": "Ratio of inner circle to outer",
"step": 0.01,
"_model_name": "FloatSliderModel",
"orientation": "horizontal",
"max": 1,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 0.8,
"_view_count": null,
"disabled": false,
"_view_module_version": "1.5.0",
"min": 0,
"continuous_update": true,
"readout_format": ".2f",
"description_tooltip": null,
"readout": true,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_6f9fe1823b1d451c856592605e272a54"
}
},
"4a8a24ffd8684a4f8d1f0188335a8b8d": {
"model_module": "@jupyter-widgets/controls",
"model_name": "IntSliderModel",
"state": {
"_view_name": "IntSliderView",
"style": "IPY_MODEL_151579360014468a925cc38966deb1e0",
"_dom_classes": [],
"description": "Number of rotations to simulate",
"step": 1,
"_model_name": "IntSliderModel",
"orientation": "horizontal",
"max": 500,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 214,
"_view_count": null,
"disabled": false,
"_view_module_version": "1.5.0",
"min": 1,
"continuous_update": true,
"readout_format": "d",
"description_tooltip": null,
"readout": true,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_4fe040a11d32448f8fa2531ab7181a8d"
}
},
"c002247f80ba4fc984ee21a06cb52f90": {
"model_module": "@jupyter-widgets/controls",
"model_name": "IntSliderModel",
"state": {
"_view_name": "IntSliderView",
"style": "IPY_MODEL_98c23b23b2234736b6af285243de20a6",
"_dom_classes": [],
"description": "Number of samples points to generate",
"step": 50,
"_model_name": "IntSliderModel",
"orientation": "horizontal",
"max": 10000,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 6950,
"_view_count": null,
"disabled": false,
"_view_module_version": "1.5.0",
"min": 100,
"continuous_update": true,
"readout_format": "d",
"description_tooltip": null,
"readout": true,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_bb39b729ad50408ba8451104adc08db9"
}
},
"eb24991ef5e34b1084036322c4f9f4db": {
"model_module": "@jupyter-widgets/output",
"model_name": "OutputModel",
"state": {
"_view_name": "OutputView",
"msg_id": "",
"_dom_classes": [],
"_model_name": "OutputModel",
"outputs": [
{
"output_type": "display_data",
"metadata": {
"tags": []
},
"image/png": "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\n",
"text/plain": "<Figure size 504x504 with 1 Axes>"
}
],
"_view_module": "@jupyter-widgets/output",
"_model_module_version": "1.0.0",
"_view_count": null,
"_view_module_version": "1.0.0",
"layout": "IPY_MODEL_df3c2bdfcc0845f68402a3a2af5baf45",
"_model_module": "@jupyter-widgets/output"
}
},
"0ad5729b2f2946e8813bfc207d0de6e9": {
"model_module": "@jupyter-widgets/controls",
"model_name": "SliderStyleModel",
"state": {
"_view_name": "StyleView",
"handle_color": null,
"_model_name": "SliderStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"f231488cb2344280bf3bf5916f4838ed": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"9ef6c899e5ec41aa95593f10022b6af7": {
"model_module": "@jupyter-widgets/controls",
"model_name": "SliderStyleModel",
"state": {
"_view_name": "StyleView",
"handle_color": null,
"_model_name": "SliderStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"6f9fe1823b1d451c856592605e272a54": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"151579360014468a925cc38966deb1e0": {
"model_module": "@jupyter-widgets/controls",
"model_name": "SliderStyleModel",
"state": {
"_view_name": "StyleView",
"handle_color": null,
"_model_name": "SliderStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"4fe040a11d32448f8fa2531ab7181a8d": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"98c23b23b2234736b6af285243de20a6": {
"model_module": "@jupyter-widgets/controls",
"model_name": "SliderStyleModel",
"state": {
"_view_name": "StyleView",
"handle_color": null,
"_model_name": "SliderStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"bb39b729ad50408ba8451104adc08db9": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"df3c2bdfcc0845f68402a3a2af5baf45": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
}
}
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/kvedala/7cc557bb2f0b30a3a1f8f2b282ac2192/spirograph.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"id": "UO_PprAYYbbP",
"colab_type": "code",
"colab": {}
},
"source": [
"import ipywidgets\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.animation import FuncAnimation\n",
"import numpy as np\n",
"plt.rcParams['animation.html'] = 'html5'"
],
"execution_count": 2,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "q94VS6xBppP8",
"colab_type": "code",
"colab": {}
},
"source": [
"def get_curve(l, k, N=500, rot=40):\n",
" R = 5\n",
" t = np.linspace(0, rot*2*np.pi, N)\n",
" x = R * ( (1-k)*np.cos(t) + l*k*np.cos( (1-k)*t/k ) )\n",
" y = R * ( (1-k)*np.sin(t) - l*k*np.sin( (1-k)*t/k ) )\n",
" return x, y"
],
"execution_count": 5,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "4M5IhY3oYsds",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 641,
"referenced_widgets": [
"9c9d9431b98341138c706efe57189d28",
"6b1b75c93d914023b2bafaec3c8d2ee6",
"1822fe1d9ace44c8bf1b2d0643702d69",
"d70bd65c7f794c92ba74258b3bf72dba",
"4a8a24ffd8684a4f8d1f0188335a8b8d",
"c002247f80ba4fc984ee21a06cb52f90",
"eb24991ef5e34b1084036322c4f9f4db",
"0ad5729b2f2946e8813bfc207d0de6e9",
"f231488cb2344280bf3bf5916f4838ed",
"9ef6c899e5ec41aa95593f10022b6af7",
"6f9fe1823b1d451c856592605e272a54",
"151579360014468a925cc38966deb1e0",
"4fe040a11d32448f8fa2531ab7181a8d",
"98c23b23b2234736b6af285243de20a6",
"bb39b729ad50408ba8451104adc08db9",
"df3c2bdfcc0845f68402a3a2af5baf45"
]
},
"outputId": "5323e47f-772a-4636-90dc-ea8d679ed04c"
},
"source": [
"@ipywidgets.interact(l=ipywidgets.FloatSlider(value=0.1, min=0, max=1, step=0.01, description=\"marker distance from centre of inner circle\"),\n",
" k=ipywidgets.FloatSlider(value=0.8, min=0, max=1, step=0.01, description=\"Ratio of inner circle to outer\"),\n",
" rot=ipywidgets.IntSlider(value=20, min=1, max=500, step=1, description=\"Number of rotations to simulate\"),\n",
" N=ipywidgets.IntSlider(value=150, min=100, max=10000, step=50, description=\"Number of samples points to generate\"))\n",
"def change_param(l, k, rot, N):\n",
" x, y = get_curve(l, k, N, rot)\n",
" fig, ax = plt.subplots(figsize=(7,7))\n",
" curve, = ax.plot(x, y, '-k')\n",
" ax.set_xticks([])\n",
" ax.set_yticks([])\n",
" for spines in ax.spines:\n",
" ax.spines[spines].set_visible(False)\n",
" fig.tight_layout()\n",
" ax.axis('equal')\n",
" # ax.set_xlim(-5, 5)\n",
" # ax.set_ylim(-5, 5)"
],
"execution_count": 6,
"outputs": [
{
"output_type": "display_data",
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9c9d9431b98341138c706efe57189d28",
"version_minor": 0,
"version_major": 2
},
"text/plain": [
"interactive(children=(FloatSlider(value=0.1, description='marker distance from centre of inner circle', max=1.…"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "Rovbw0pdtWe1",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment