Last active
February 18, 2022 12:28
-
-
Save mirrornerror/7c9f7d6cb3026dc4557eb7f600c07ad5 to your computer and use it in GitHub Desktop.
Hilbert_curve.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "# Hilbert Curve Drawing \n#### Order = 1, 2, 3 ... (4 dots, 16 dots, 64 dots ...) \n\n[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](http://colab.research.google.com/gist/mirrornerror/7c9f7d6cb3026dc4557eb7f600c07ad5/Hilbert_curve.ipynb) " | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2022-02-18T12:27:59.239566Z", | |
"end_time": "2022-02-18T12:27:59.999513Z" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "from numpy import array, arange\nimport matplotlib.pyplot as plt\nfrom matplotlib import animation\nfrom IPython.display import HTML, display", | |
"execution_count": 1, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2022-02-18T12:28:01.181454Z", | |
"end_time": "2022-02-18T12:28:01.225781Z" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "# Plot function\ndef Plot(X, Y, outline=False, num=False, dot=False):\n N = int((len(X))**0.5)\n fig = plt.figure(figsize=(8,8))\n ax = fig.add_subplot(111)\n ax.axis([0, N, 0, N])\n \n if outline == False:\n ax.axis('off')\n ax.plot(X, Y, color='tab:blue')\n if num:\n for i in range(len(X)):\n ax.text(X[i]+0.02, Y[i]+0.02, s=str(i))\n if dot:\n ax.scatter(X, Y, color='tab:blue')\n ax.grid()\n plt.xticks(arange(0, N+1, max(1, N//4)))\n plt.yticks(arange(0, N+1, max(1, N//4)))\n plt.show()\n plt.close()\n\n# Animation function\ndef Anim(X, Y, outline=False, save=False):\n N = int((len(X))**0.5)\n fig = plt.figure(figsize=(8,8))\n ax = fig.add_subplot(111)\n ax.axis([0, N, 0, N])\n ax.grid()\n plt.xticks(arange(0, N+1, max(1, N//4)))\n plt.yticks(arange(0, N+1, max(1, N//4)))\n if outline == False:\n ax.axis('off') \n ims = []\n for i in range(len(X) + 1): \n A = ax.plot(X[:i], Y[:i], color='tab:blue')\n ims.append(A)\n ani = animation.ArtistAnimation(fig,ims,interval=100)\n if save:\n ani.save('anim.gif', writer = 'pillow') # writer='Imagemagick', 'ffmpeg', Windows for 'pillow'\n #HTML(ani.to_html5_video()) \n display(HTML(ani.to_jshtml()))\n plt.close()", | |
"execution_count": 2, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2022-02-18T12:28:03.882607Z", | |
"end_time": "2022-02-18T12:28:03.902515Z" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "# Hilbert curve function\ndef Hilbert(ORDER): # ORDER 1: 4 dots, ORDER 2: 16 dots, ORDER 3: 64 dots ...\n N = 2**ORDER # the number of row or columns of the dots\n X,Y = [], [] # empty lists for X and Y coodinates outputs\n for i in range(N * N): # iteration: the total number of the dots\n U = [[0, 0], [0, 1], [1, 1], [1, 0]] # initial four dots coodinates: origin, up, right, down\n px, py = 0.5, 0.5 # starting coodinates (initial offsets)\n for j in reversed(range(ORDER)): # reversed iteration: j=2,1,0 when ORDER=3\n ID = i // 4**j % 4 # index number depending on ORDER\n L = 2**j # unit length under ORDER: L=4, 2, 1 when ORDER=3\n if ID == 0:\n U[1], U[3] = U[3], U[1] # swap 1st with 3rd dots when ID is 0\n elif ID == 3:\n U[0], U[2] = U[2], U[0] # swap 0th with 2nd dots when ID is 3\n px += U[ID][0] * L # add each length depending on ORDER\n py += U[ID][1] * L\n X.append(px) # preserve (x, y) coodinates of the dots\n Y.append(py)\n return X, Y", | |
"execution_count": 3, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Draw Hilvert Curve" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2022-02-18T12:28:19.265054Z", | |
"end_time": "2022-02-18T12:28:19.335951Z" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "# Draw Hilbert curve\nX, Y = Hilbert(4) # argument: Order from 1 to n\nPlot(X, Y) # arguments: X, Y, outline=False, num=False, dot=False\n#Anim(X, Y) # arguments: X, Y, outline=False, save=False", | |
"execution_count": 5, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": "<Figure size 576x576 with 1 Axes>", | |
"image/png": "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\n" | |
}, | |
"metadata": { | |
"needs_background": "light" | |
} | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "", | |
"execution_count": null, | |
"outputs": [] | |
} | |
], | |
"metadata": { | |
"_draft": { | |
"nbviewer_url": "https://gist.github.com/7c9f7d6cb3026dc4557eb7f600c07ad5" | |
}, | |
"gist": { | |
"id": "7c9f7d6cb3026dc4557eb7f600c07ad5", | |
"data": { | |
"description": "Hilbert_curve.ipynb", | |
"public": true | |
} | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3", | |
"language": "python" | |
}, | |
"language_info": { | |
"name": "python", | |
"version": "3.8.5", | |
"mimetype": "text/x-python", | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"pygments_lexer": "ipython3", | |
"nbconvert_exporter": "python", | |
"file_extension": ".py" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment