From 939a0799afecd4b1186a0c8f1e10f35aaa1641af Mon Sep 17 00:00:00 2001 From: Vikram Date: Sun, 28 Feb 2021 17:05:19 -0700 Subject: [PATCH 1/4] added translate, scale, their test files, and docs --- docs/img/scale_1.png | Bin 0 -> 9283 bytes docs/img/scale_2.png | Bin 0 -> 6058 bytes docs/img/translate.png | Bin 0 -> 5671 bytes docs/utilities.md | 103 +- spark/core.py | 6 + .../util/helper_functions/canvas_functions.py | 13 + test/ScaleTest.ipynb | 1322 +++++++++++++++++ test/TranslateTest.ipynb | 1101 ++++++++++++++ 8 files changed, 2544 insertions(+), 1 deletion(-) create mode 100644 docs/img/scale_1.png create mode 100644 docs/img/scale_2.png create mode 100644 docs/img/translate.png create mode 100644 test/ScaleTest.ipynb create mode 100644 test/TranslateTest.ipynb diff --git a/docs/img/scale_1.png b/docs/img/scale_1.png new file mode 100644 index 0000000000000000000000000000000000000000..265608a8990199021371f06ae539445ba6fc37e9 GIT binary patch literal 9283 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 KwaahXKl?Ah5Q^sj literal 0 HcmV?d00001 diff --git a/docs/utilities.md b/docs/utilities.md index 767e1af..247be95 100644 --- a/docs/utilities.md +++ b/docs/utilities.md @@ -92,4 +92,105 @@ def setup(): Results in: -![rotate demo](img/rotate.png) \ No newline at end of file +![rotate demo](img/rotate.png) + +### Scale (one parameter) + +Scales the canvas units by x horizontally and vertically. + +Usage: + +```python +scale(x) +``` +**Parameters** + +- x: (float) The factor by which the canvas is scaled. + +**Example(s):** + +*Scale horizontal and vertical canvas units by a factor of 2* + +```python hl_lines="6" +%%ignite +def setup(): + size(400, 400) + circle(100, 100, 100) + fill_style("red") + + # apply scale of 2, this will scale canvas units by factor of 2 horizontally and vertically + scale(2) + circle(100, 100, 100) +``` + +Results in: + +![scale demo](img/scale_1.png) + +### Scale (two parameters) + +Scales the canvas units by x horizontally and by y vertically. + +Usage: + +```python +scale(x,y) +``` +**Parameters** + +- x: (float) The factor by which the canvas is scaled horizontally. +- y: (float) The factor by which the canvas is scaled vertically. + +**Example(s):** + +*Scale horizontal and vertical canvas units by factors of 0.75 and 1.25 respectively* + +```python hl_lines="6" +%%ignite +def setup(): + size(400, 400) + circle(100, 100, 100) + fill_style("red") + + # apply scale of (0.75, 1.25), this will scale canvas units by factor of 0.75 horizontally and 1.25 vertically + scale(0.75, 1.25) + circle(100, 100, 100) +``` + +Results in: + +![scale demo](img/scale_2.png) + +### Translate + +Moves the canvas and its origin on the grid. x indicates the horizontal distance to move, and y indicates vertical distance to move. + +Usage: + +```python +translate(x,y) +``` +**Parameters** + +- x: (float) The horizontal distance to translate the canvas. +- y: (float) The vertical distance to translate the canvas. + +**Example(s):** + +*Translate the canvas 50 units right and 75 units down* + +```python hl_lines="6" +%%ignite +def setup(): + size(400, 400) + circle(100, 100, 100) + fill_style("red") + + # move canvas 50 units right, and 75 units down + translate(50, 75) + circle(100, 100, 100) +``` + +Results in: + +![translate demo](img/translate.png) diff --git a/spark/core.py b/spark/core.py index 46ba78b..760228e 100644 --- a/spark/core.py +++ b/spark/core.py @@ -333,6 +333,12 @@ def background(self, *args): pass @extern def rotate(self, *args): pass + + @extern + def translate(self, *args): pass + + @extern + def scale(self, *args): pass # From util.helper_functions.rect_functions diff --git a/spark/util/helper_functions/canvas_functions.py b/spark/util/helper_functions/canvas_functions.py index ceb6c17..181407b 100644 --- a/spark/util/helper_functions/canvas_functions.py +++ b/spark/util/helper_functions/canvas_functions.py @@ -40,3 +40,16 @@ def helper_background(self, *args): @ignite_global def helper_rotate(self, *args): self.canvas.rotate(args[0]) + +@validate_args([Real, Real]) +@ignite_global +def helper_translate(self, *args): + self.canvas.translate(args[0], args[1]) + +@validate_args([Real], [Real, Real]) +@ignite_global +def helper_scale(self, *args): + if len(args) == 1: + self.canvas.scale(args[0]) + else: + self.canvas.scale(args[0], args[1]) diff --git a/test/ScaleTest.ipynb b/test/ScaleTest.ipynb new file mode 100644 index 0000000..38515eb --- /dev/null +++ b/test/ScaleTest.ipynb @@ -0,0 +1,1322 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "infinite-webster", + "metadata": {}, + "outputs": [], + "source": [ + "import spark\n", + "%reload_ext spark" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "affiliated-hopkins", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Done drawing.\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "Done drawing.\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "Done drawing." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "36adef58bab442ceb9792fd10e871a30", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Canvas(height=100, width=100)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\n", + "\\end{Verbatim}\n" + ], + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%ignite\n", + "def setup():\n", + " size(400, 400)\n", + " circle(100, 100, 100)\n", + " fill_style(\"red\")\n", + " \n", + " # apply scale of 1, should not change anything\n", + " scale(1)\n", + " circle(100, 100, 100)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "surrounded-medication", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Done drawing.\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "Done drawing.\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "Done drawing." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "482847c670a44454a5d53c09d81c082b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Canvas(height=100, width=100)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\n", + "\\end{Verbatim}\n" + ], + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%ignite\n", + "def setup():\n", + " size(400, 400)\n", + " circle(100, 100, 100)\n", + " fill_style(\"red\")\n", + " \n", + " # apply scale of 2, this will scale canvas units by factor of 2 horizontally and vertically\n", + " scale(2)\n", + " circle(100, 100, 100)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "stainless-envelope", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Done drawing.\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "Done drawing.\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "Done drawing." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "92ba410863a84bcab3483e90b7430cea", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Canvas(height=100, width=100)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\n", + "\\end{Verbatim}\n" + ], + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%ignite\n", + "def setup():\n", + " size(400, 400)\n", + " circle(100, 100, 100)\n", + " fill_style(\"red\")\n", + " \n", + " # apply scale of 0.5, this will scale canvas units by factor of 0.5 horizontally and vertically\n", + " scale(0.5)\n", + " circle(100, 100, 100)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "false-graduate", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Done drawing.\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "Done drawing.\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "Done drawing." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c6bfbc56c2ab44af9c9c35df77a95004", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Canvas(height=100, width=100)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\n", + "\\end{Verbatim}\n" + ], + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%ignite\n", + "def setup():\n", + " size(400, 400)\n", + " circle(100, 100, 100)\n", + " fill_style(\"red\")\n", + " \n", + " # apply scale of (1, 3), this will scale canvas units by factor of 3 vertically\n", + " scale(1, 3)\n", + " circle(100, 100, 100)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "professional-moses", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Done drawing.\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "Done drawing.\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "Done drawing." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7743615c75c944be8c29d0ff5a3c82e8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Canvas(height=100, width=100)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\n", + "\\end{Verbatim}\n" + ], + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%ignite\n", + "def setup():\n", + " size(400, 400)\n", + " circle(100, 100, 100)\n", + " fill_style(\"red\")\n", + " \n", + " # apply scale of (3, 1), this will scale canvas units by factor of 3 horizontally\n", + " scale(3, 1)\n", + " circle(100, 100, 100)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "stable-standard", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Done drawing.\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "Done drawing.\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "Done drawing." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "83cbb21bd81c482e90dc34e8da50f28d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Canvas(height=100, width=100)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\n", + "\\end{Verbatim}\n" + ], + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%ignite\n", + "def setup():\n", + " size(400, 400)\n", + " circle(100, 100, 100)\n", + " fill_style(\"red\")\n", + " \n", + " # apply scale of (0.75, 1.25), this will scale canvas units by factor of 0.75 horizontally and 1.25 vertically\n", + " scale(0.75, 1.25)\n", + " circle(100, 100, 100)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "banner-patch", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.8.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/test/TranslateTest.ipynb b/test/TranslateTest.ipynb new file mode 100644 index 0000000..c17057a --- /dev/null +++ b/test/TranslateTest.ipynb @@ -0,0 +1,1101 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "mounted-bathroom", + "metadata": {}, + "outputs": [], + "source": [ + "import spark\n", + "%reload_ext spark" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "chronic-rental", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Done drawing.\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "Done drawing.\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "Done drawing." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "31c3b1fd61914814bee2e5b5e90586e6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Canvas(height=100, width=100)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\n", + "\\end{Verbatim}\n" + ], + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%ignite\n", + "def setup():\n", + " size(400, 400)\n", + " circle(100, 100, 100)\n", + " fill_style(\"red\")\n", + " \n", + " # move by 0 units on the x-axis and 0 units on the y-axis --- should not change anything\n", + " translate(0, 0)\n", + " circle(100, 100, 100)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "collectible-commerce", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Done drawing.\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "Done drawing.\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "Done drawing." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a5aa3bbeb47f406caa87f80e858cb20a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Canvas(height=100, width=100)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\n", + "\\end{Verbatim}\n" + ], + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%ignite\n", + "def setup():\n", + " size(400, 400)\n", + " circle(100, 100, 100)\n", + " fill_style(\"red\")\n", + " \n", + " # move canvas 125 units left, and 10 units up\n", + " translate(-25, -10)\n", + " circle(100, 100, 100)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "liked-exploration", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Done drawing.\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "Done drawing.\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "Done drawing." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e56d236f558345eba65586f98b4452ff", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Canvas(height=100, width=100)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\n", + "\\end{Verbatim}\n" + ], + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%ignite\n", + "def setup():\n", + " size(400, 400)\n", + " circle(100, 100, 100)\n", + " fill_style(\"red\")\n", + " \n", + " # move canvas 30 units right, and 60 units up\n", + " translate(30, -60)\n", + " circle(100, 100, 100)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "stupid-understanding", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Done drawing.\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "Done drawing.\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "Done drawing." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fea9cdb438cd449284a7a42f94771d9b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Canvas(height=100, width=100)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\n", + "\\end{Verbatim}\n" + ], + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%ignite\n", + "def setup():\n", + " size(400, 400)\n", + " circle(100, 100, 100)\n", + " fill_style(\"red\")\n", + " \n", + " # move canvas 50 units right, and 75 units down\n", + " translate(50, 75)\n", + " circle(100, 100, 100)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "basic-operator", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Done drawing.\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "Done drawing.\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "Done drawing." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "57ef185dfe334543b309043a819905a9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Canvas(height=100, width=100)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\n", + "\\end{Verbatim}\n" + ], + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%ignite\n", + "def setup():\n", + " size(400, 400)\n", + " circle(100, 100, 100)\n", + " fill_style(\"red\")\n", + " \n", + " # move canvas 50 units left, and 80 units down\n", + " translate(-50, 80)\n", + " circle(100, 100, 100)" + ] + } + ], + "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.8.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 585dd6b7ee1c1e5ed8ae471effc1e3c4917ca8ca Mon Sep 17 00:00:00 2001 From: Vikram Date: Sun, 28 Feb 2021 17:11:23 -0700 Subject: [PATCH 2/4] resolve conflict --- docs/utilities.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/utilities.md b/docs/utilities.md index 247be95..b864b39 100644 --- a/docs/utilities.md +++ b/docs/utilities.md @@ -94,6 +94,38 @@ Results in: ![rotate demo](img/rotate.png) +### Distance between two points (x1, y1) and (x2, y2) + +![dist explanation](img/dist.png) + +To find the distance between two points (x1, y1) and (x2, y2), use the following command: + +```python +dist(x1, y1, x2, y2) +``` + +**Parameters** + +- x1: (float) The x-coordinate of the first point +- y1: (float) The y-coordinate of the first point +- x2: (float) The x-coordinate of the second point +- y2: (float) The y-coordinate of the second point + +**Example(s):** + +*Print the distance between (125, 125) and (375, 375)* + +```python hl_lines="6" +%%ignite + +def setup(): + print(dist(125, 125, 375, 375)) +``` + +Results in: + +![dist demo](img/dist_2.png) + ### Scale (one parameter) Scales the canvas units by x horizontally and vertically. From 738ce3858735813ac405db9a6759b72bdf6b6113 Mon Sep 17 00:00:00 2001 From: Vikram Date: Fri, 5 Mar 2021 17:44:25 -0700 Subject: [PATCH 3/4] Made several revisions --- docs/img/scale_1.png | Bin 9283 -> 7934 bytes docs/img/scale_2.png | Bin 6058 -> 4811 bytes docs/img/translate.png | Bin 5671 -> 4557 bytes docs/utilities.md | 143 +++--- spark/core.py | 6 +- .../util/helper_functions/canvas_functions.py | 5 +- test/ScaleTest.ipynb | 445 +++++++++++++++++- test/TranslateTest.ipynb | 30 +- 8 files changed, 532 insertions(+), 97 deletions(-) diff --git a/docs/img/scale_1.png b/docs/img/scale_1.png index 265608a8990199021371f06ae539445ba6fc37e9..fddee84edb19c9c4a9c038911fb16395d1674879 100644 GIT binary patch literal 7934 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 literal 9283 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 NyR(iqrDr^E{ts!{lji^c literal 6058 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 literal 5671 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 KwaahXKl?Ah5Q^sj diff --git a/docs/utilities.md b/docs/utilities.md index b864b39..ffe69c5 100644 --- a/docs/utilities.md +++ b/docs/utilities.md @@ -56,173 +56,174 @@ Results in: ![random demo](img/randint.png) +### Distance between two points (x1, y1) and (x2, y2) +![dist explanation](img/dist.png) -### Rotation - -![rotation explanation](rotation_explanation.png) - -Transformations are always done to the **canvas**, not the individual shapes themselves. Rotation is done around the origin, point (0, 0) and affects all shapes drawn afterwards. You can use our built-in `pi` variable to express radians, or convert from degrees to radians by multiplying your number of degrees by `pi / 180`. - -Note that canvas transformations are not removed automatically. In other words, if you want to rotate just one shape in your `draw()` function, you should rotate the canvas by `r` radians, draw your shape, and then rotate by `-r` radians to undo the effect. - -To rotate the canvas clockwise around the origin, use: +To find the distance between two points (x1, y1) and (x2, y2), use the following command: ```python -rotate(r) +dist(x1, y1, x2, y2) ``` **Parameters** -- r: (float) The angle, in radians to rotate the canvas +- x1: (float) The x-coordinate of the first point +- y1: (float) The y-coordinate of the first point +- x2: (float) The x-coordinate of the second point +- y2: (float) The y-coordinate of the second point **Example(s):** -*Rotating a rectangle by 30 degrees clockwise* +*Print the distance between (125, 125) and (375, 375)* -```python hl_lines="6" +```python hl_lines="4" %%ignite def setup(): - size(300, 300) - - rotate(pi / 6) # Rotate pi/6 radians (30 degrees) clockwise - rect(100, 0, 80, 50) + print(dist(125, 125, 375, 375)) ``` Results in: -![rotate demo](img/rotate.png) +![dist demo](img/dist_2.png) -### Distance between two points (x1, y1) and (x2, y2) +### Translate -![dist explanation](img/dist.png) +Change the origin of the canvas. -To find the distance between two points (x1, y1) and (x2, y2), use the following command: +Usage: ```python -dist(x1, y1, x2, y2) +translate(x, y) ``` - **Parameters** -- x1: (float) The x-coordinate of the first point -- y1: (float) The y-coordinate of the first point -- x2: (float) The x-coordinate of the second point -- y2: (float) The y-coordinate of the second point +- x: (float) The horizontal distance to translate the canvas. +- y: (float) The vertical distance to translate the canvas. **Example(s):** -*Print the distance between (125, 125) and (375, 375)* +*Translate the canvas 50 units right and 75 units down* -```python hl_lines="6" +```python hl_lines="8" %%ignite def setup(): - print(dist(125, 125, 375, 375)) + size(400, 400) + fill_style("red") + + # move canvas 50 units right, and 75 units down + translate(50, 75) + circle(0, 0, 100) ``` Results in: -![dist demo](img/dist_2.png) +![translate demo](img/translate.png) -### Scale (one parameter) +### Rotation -Scales the canvas units by x horizontally and vertically. +![rotation explanation](rotation_explanation.png) -Usage: +Transformations are always done to the **canvas**, not the individual shapes themselves. Rotation is done around the origin, point (0, 0) and affects all shapes drawn afterwards. You can use our built-in `pi` variable to express radians, or convert from degrees to radians by multiplying your number of degrees by `pi / 180`. + +Note that canvas transformations are not removed automatically. In other words, if you want to rotate just one shape in your `draw()` function, you should rotate the canvas by `r` radians, draw your shape, and then rotate by `-r` radians to undo the effect. Also note that you can rotate on a point other than the origin by first calling `translate` to change the origin to the new point. + +To rotate the canvas clockwise around the origin, use: ```python -scale(x) +rotate(r) ``` + **Parameters** -- x: (float) The factor by which the canvas is scaled. +- r: (float) The angle, in radians to rotate the canvas **Example(s):** -*Scale horizontal and vertical canvas units by a factor of 2* +*Rotating a rectangle by 30 degrees clockwise* ```python hl_lines="6" %%ignite + def setup(): - size(400, 400) - circle(100, 100, 100) - fill_style("red") - - # apply scale of 2, this will scale canvas units by factor of 2 horizontally and vertically - scale(2) - circle(100, 100, 100) + size(300, 300) + + rotate(pi / 6) # Rotate pi/6 radians (30 degrees) clockwise + rect(100, 0, 80, 50) ``` Results in: -![scale demo](img/scale_1.png) +![rotate demo](img/rotate.png) -### Scale (two parameters) +### Scale -Scales the canvas units by x horizontally and by y vertically. +Scales the canvas. Note that scaling applies to the canvas, not to individual shapes. You can scale on a point other than the origin by first calling `translate` to change the origin to the new point. -Usage: +There are two ways to use scale: + +| Method | Description | Syntax | +| -------------------------------- | -----------------------------------------------------------------------------|-----------------| +|[1 float](#scale-with-one-float) | Scale canvas width and height by some amount, i.e. 1.5 | scale(1.5) | +|[2 floats](#scale-with-two-floats)| Scale canvas width by first number and height by second number, i.e. 2.5, 3.5| scale(2.5, 3.5) | + +#### Scale with one float ```python -scale(x,y) +scale(n) ``` **Parameters** -- x: (float) The factor by which the canvas is scaled horizontally. -- y: (float) The factor by which the canvas is scaled vertically. +- n: (float) The amount to scale the height and width of the canvas. **Example(s):** -*Scale horizontal and vertical canvas units by factors of 0.75 and 1.25 respectively* +*Double height and width of canvas using scale* -```python hl_lines="6" +```python hl_lines="8" %%ignite + def setup(): size(400, 400) - circle(100, 100, 100) fill_style("red") - # apply scale of (0.75, 1.25), this will scale canvas units by factor of 0.75 horizontally and 1.25 vertically - scale(0.75, 1.25) + # apply scale of 2, this will scale canvas units by factor of 2 horizontally and vertically + scale(2) circle(100, 100, 100) ``` Results in: -![scale demo](img/scale_2.png) - -### Translate - -Moves the canvas and its origin on the grid. x indicates the horizontal distance to move, and y indicates vertical distance to move. +![scale demo](img/scale_1.png) -Usage: +#### Scale with two floats ```python -translate(x,y) +scale(x, y) ``` **Parameters** -- x: (float) The horizontal distance to translate the canvas. -- y: (float) The vertical distance to translate the canvas. +- x: (float) The amount to scale the width of the canvas. +- y: (float) The amount to scale the height of the canvas. **Example(s):** -*Translate the canvas 50 units right and 75 units down* +*Scale canvas width by 0.75 and canvas height by 1.25* -```python hl_lines="6" +```python hl_lines="8" %%ignite + def setup(): size(400, 400) - circle(100, 100, 100) fill_style("red") - # move canvas 50 units right, and 75 units down - translate(50, 75) + # apply scale of (0.75, 1.25), this will scale canvas units by factor of 0.75 horizontally and 1.25 vertically + scale(0.75, 1.25) circle(100, 100, 100) ``` Results in: -![translate demo](img/translate.png) +![scale demo](img/scale_2.png) diff --git a/spark/core.py b/spark/core.py index 39ece27..f4909d6 100644 --- a/spark/core.py +++ b/spark/core.py @@ -331,11 +331,11 @@ def clear(self, *args): pass @extern def background(self, *args): pass - @extern - def rotate(self, *args): pass - @extern def translate(self, *args): pass + + @extern + def rotate(self, *args): pass @extern def scale(self, *args): pass diff --git a/spark/util/helper_functions/canvas_functions.py b/spark/util/helper_functions/canvas_functions.py index 181407b..ad7b15b 100644 --- a/spark/util/helper_functions/canvas_functions.py +++ b/spark/util/helper_functions/canvas_functions.py @@ -49,7 +49,4 @@ def helper_translate(self, *args): @validate_args([Real], [Real, Real]) @ignite_global def helper_scale(self, *args): - if len(args) == 1: - self.canvas.scale(args[0]) - else: - self.canvas.scale(args[0], args[1]) + self.canvas.scale(*args) diff --git a/test/ScaleTest.ipynb b/test/ScaleTest.ipynb index 38515eb..0121178 100644 --- a/test/ScaleTest.ipynb +++ b/test/ScaleTest.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "infinite-webster", + "id": "intimate-crest", "metadata": {}, "outputs": [], "source": [ @@ -14,7 +14,7 @@ { "cell_type": "code", "execution_count": 30, - "id": "affiliated-hopkins", + "id": "original-donna", "metadata": {}, "outputs": [ { @@ -227,7 +227,7 @@ { "cell_type": "code", "execution_count": 31, - "id": "surrounded-medication", + "id": "temporal-caution", "metadata": {}, "outputs": [ { @@ -440,7 +440,7 @@ { "cell_type": "code", "execution_count": 32, - "id": "stainless-envelope", + "id": "rotary-insert", "metadata": {}, "outputs": [ { @@ -653,7 +653,7 @@ { "cell_type": "code", "execution_count": 33, - "id": "false-graduate", + "id": "collectible-hacker", "metadata": {}, "outputs": [ { @@ -866,7 +866,7 @@ { "cell_type": "code", "execution_count": 34, - "id": "professional-moses", + "id": "covered-interest", "metadata": {}, "outputs": [ { @@ -1079,7 +1079,7 @@ { "cell_type": "code", "execution_count": 35, - "id": "stable-standard", + "id": "variable-waste", "metadata": {}, "outputs": [ { @@ -1289,10 +1289,439 @@ " circle(100, 100, 100)" ] }, + { + "cell_type": "code", + "execution_count": 8, + "id": "perfect-carry", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Done drawing.\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "Done drawing.\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "Done drawing." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0214b3ea53534ec895bd658b5661edfd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Canvas(height=100, width=100)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\n", + "\\end{Verbatim}\n" + ], + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%ignite\n", + "def setup():\n", + " size(400, 400)\n", + " circle(100, 100, 100)\n", + " fill_style(\"red\")\n", + " \n", + " # apply scale of (0, 1.25), meaning the red circle will have no width\n", + " scale(0, 1.25)\n", + " circle(100, 100, 100)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "metropolitan-prophet", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Done drawing.\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "Done drawing.\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "Done drawing." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "261976be66d64d97a30ca0884e3cc593", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Canvas(height=100, width=100)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\n", + "\\end{Verbatim}\n" + ], + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%ignite\n", + "def setup():\n", + " size(400, 400)\n", + " fill_style(\"red\")\n", + " \n", + " # apply scale of (-0.75, 1.25)\n", + " scale(-0.75, 1.25)\n", + " \n", + " # translate to be able to see negative x value locations\n", + " translate(-200, 0)\n", + " \n", + " circle(100, 100, 100)" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "banner-patch", + "id": "unsigned-record", "metadata": {}, "outputs": [], "source": [] diff --git a/test/TranslateTest.ipynb b/test/TranslateTest.ipynb index c17057a..69fb641 100644 --- a/test/TranslateTest.ipynb +++ b/test/TranslateTest.ipynb @@ -2,8 +2,8 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, - "id": "mounted-bathroom", + "execution_count": 2, + "id": "thousand-layer", "metadata": {}, "outputs": [], "source": [ @@ -14,7 +14,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "chronic-rental", + "id": "heated-viking", "metadata": {}, "outputs": [ { @@ -227,7 +227,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "collectible-commerce", + "id": "failing-brooks", "metadata": {}, "outputs": [ { @@ -440,7 +440,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "liked-exploration", + "id": "blind-issue", "metadata": {}, "outputs": [ { @@ -653,7 +653,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "stupid-understanding", + "id": "previous-oklahoma", "metadata": {}, "outputs": [ { @@ -865,8 +865,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "basic-operator", + "execution_count": 3, + "id": "international-congress", "metadata": {}, "outputs": [ { @@ -963,7 +963,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "57ef185dfe334543b309043a819905a9", + "model_id": "c27d788da0564689bf923f301bd4c2cd", "version_major": 2, "version_minor": 0 }, @@ -1071,10 +1071,18 @@ " circle(100, 100, 100)\n", " fill_style(\"red\")\n", " \n", - " # move canvas 50 units left, and 80 units down\n", - " translate(-50, 80)\n", + " # move canvas 50.5 units left, and 80.5 units down\n", + " translate(-50.5, 80.5)\n", " circle(100, 100, 100)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "architectural-diploma", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 106be038da9e53a08808936d0fb1d3cdcea77744 Mon Sep 17 00:00:00 2001 From: Vikram Date: Fri, 5 Mar 2021 17:55:06 -0700 Subject: [PATCH 4/4] Fixed tests --- test/TranslateTest.ipynb | 46 ++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/test/TranslateTest.ipynb b/test/TranslateTest.ipynb index 69fb641..986cded 100644 --- a/test/TranslateTest.ipynb +++ b/test/TranslateTest.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "thousand-layer", + "id": "legendary-cyprus", "metadata": {}, "outputs": [], "source": [ @@ -13,8 +13,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "heated-viking", + "execution_count": 15, + "id": "invalid-banks", "metadata": {}, "outputs": [ { @@ -111,7 +111,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "31c3b1fd61914814bee2e5b5e90586e6", + "model_id": "fea9cdb438cd449284a7a42f94771d9b", "version_major": 2, "version_minor": 0 }, @@ -219,15 +219,15 @@ " circle(100, 100, 100)\n", " fill_style(\"red\")\n", " \n", - " # move by 0 units on the x-axis and 0 units on the y-axis --- should not change anything\n", - " translate(0, 0)\n", + " # move canvas 50 units right, and 75 units down\n", + " translate(50, 75)\n", " circle(100, 100, 100)" ] }, { "cell_type": "code", - "execution_count": 13, - "id": "failing-brooks", + "execution_count": 3, + "id": "brown-shadow", "metadata": {}, "outputs": [ { @@ -324,7 +324,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "a5aa3bbeb47f406caa87f80e858cb20a", + "model_id": "31c3b1fd61914814bee2e5b5e90586e6", "version_major": 2, "version_minor": 0 }, @@ -432,15 +432,15 @@ " circle(100, 100, 100)\n", " fill_style(\"red\")\n", " \n", - " # move canvas 125 units left, and 10 units up\n", - " translate(-25, -10)\n", + " # move by 0 units on the x-axis and 0 units on the y-axis --- red circle should overlap with black circle\n", + " translate(0, 0)\n", " circle(100, 100, 100)" ] }, { "cell_type": "code", - "execution_count": 14, - "id": "blind-issue", + "execution_count": 13, + "id": "quarterly-discretion", "metadata": {}, "outputs": [ { @@ -537,7 +537,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e56d236f558345eba65586f98b4452ff", + "model_id": "a5aa3bbeb47f406caa87f80e858cb20a", "version_major": 2, "version_minor": 0 }, @@ -645,15 +645,15 @@ " circle(100, 100, 100)\n", " fill_style(\"red\")\n", " \n", - " # move canvas 30 units right, and 60 units up\n", - " translate(30, -60)\n", + " # move canvas 25 units left, and 10 units up\n", + " translate(-25, -10)\n", " circle(100, 100, 100)" ] }, { "cell_type": "code", - "execution_count": 15, - "id": "previous-oklahoma", + "execution_count": 14, + "id": "african-orbit", "metadata": {}, "outputs": [ { @@ -750,7 +750,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "fea9cdb438cd449284a7a42f94771d9b", + "model_id": "e56d236f558345eba65586f98b4452ff", "version_major": 2, "version_minor": 0 }, @@ -858,15 +858,15 @@ " circle(100, 100, 100)\n", " fill_style(\"red\")\n", " \n", - " # move canvas 50 units right, and 75 units down\n", - " translate(50, 75)\n", + " # move canvas 30 units right, and 60 units up\n", + " translate(30, -60)\n", " circle(100, 100, 100)" ] }, { "cell_type": "code", "execution_count": 3, - "id": "international-congress", + "id": "thick-dance", "metadata": {}, "outputs": [ { @@ -1079,7 +1079,7 @@ { "cell_type": "code", "execution_count": null, - "id": "architectural-diploma", + "id": "encouraging-bones", "metadata": {}, "outputs": [], "source": []