{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Week 3 Day 5 afternoon: Graphics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "%run \"boaz_utils.ipynb\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Graphics on a computer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "This image is made of 1,000,000 little dots- __pixels__ ($1024\\times 768$).\n",
    "\n",
    "Each pixel has a different color."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "All colors are obtained by mixing <span style=\"color:red\">red</span>, <span style=\"color:green\">green</span> and <span style=\"color:blue\">blue</span>   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "from PIL import Image\n",
    "import numpy as np\n",
    "\n",
    "def empty_screen(w=100,h=100):\n",
    "    res = [ [color(255,255,255) for i in range(h)] for j in range(w)]\n",
    "    return res\n",
    "    \n",
    "def color(red=0,green=0,blue=0):\n",
    "    return (red,green,blue) \n",
    "\n",
    "def array_to_image(array, scale=2):\n",
    "    w = len(array)\n",
    "    h = len(array[0])\n",
    "    data = np.zeros((h*scale, w*scale, 3), dtype=np.uint8)\n",
    "    for i in range(w):\n",
    "        for j in range(h):\n",
    "            for k in range(scale):\n",
    "                for l in range(scale):\n",
    "                    data[(h-1)*scale-(j*scale + k),i*scale+l] = array[i][j]\n",
    "    img = Image.fromarray(data, 'RGB')\n",
    "    img.save('my.png')\n",
    "    return dsp.Image(filename='my.png')\n",
    "    \n",
    "\n",
    "    \n",
    "def plot_array(array, scale=2):\n",
    "    dsp.clear_output(True)\n",
    "    dsp.display_png(array_to_image(array,scale))\n",
    "    # sys.stdout.flush()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true,
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "def plot_array(array, scale=2):\n",
    "    dsp.clear_output(True)\n",
    "    w = len(array)\n",
    "    h = len(array[0])\n",
    "    data = np.zeros((h*scale, w*scale, 3), dtype=np.uint8)\n",
    "    for i in range(w):\n",
    "        for j in range(h):\n",
    "            for k in range(scale):\n",
    "                for l in range(scale):\n",
    "                    data[(h-1)*scale-(j*scale + k),i*scale+l] = array[i][j]\n",
    "    img = Image.fromarray(data, 'RGB')\n",
    "    display(img) # ,Image.LANCZOS)\n",
    "    return None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "def RGB(red,green,blue):\n",
    "    s = empty_screen(100,100)\n",
    "    for i in range(len(s)):\n",
    "        for j in range(len(s[i])):\n",
    "            s[i][j] = color(red,green,blue)\n",
    "    return array_to_image(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "from ipywidgets import interact,interactive, fixed, Box\n",
    "import ipywidgets as widgets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "import IPython.display as dsp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "def demo_RGB():\n",
    "    interact(RGB, red=widgets.IntSlider(min=0,max=255,step=5,value=255),\n",
    "        green=widgets.IntSlider(min=0,max=255,step=5,value=0),\n",
    "         blue=widgets.IntSlider(min=0,max=255,step=5,value=0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "bad9f2ce44874c7489fe5c055bfdcd75",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(IntSlider(value=255, description='red', max=255, step=5), IntSlider(value=0, description…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "demo_RGB()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "source": [
    "```color(red,green,blue)```: just returns list of 3 numbers <br>\n",
    "\n",
    "* ```empty_screen(height,width)```: returns a ```width``` $\\times$ ```height``` array ```s``` (namely a list  of ```width``` lists, each of them is of  length ```height```). For every ```x``` between 0 and ```width``` and ```y``` between 0 and ```height```,  ```s[x][y] = color(255,255,255)```.\n",
    "\n",
    "* ```plot_array(s)```: plots the array ```s``` on the screen where ```s[0][0]``` corresponds to the bottom left corner and ```s[width][length]``` corresponds to the top right corner.\n",
    "\n",
    "We will now demonstrate how to use these functions:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAACE0lEQVR4nO3SQQkAIADAQLV/Zy3hEOQuwR6be+wBt63XAfzJWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXCWCSMRcJYJIxFwlgkjEXiAFUkA45aNvq/AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=200x200 at 0x7F709DEF5B80>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "c = [255,0,255]\n",
    "s = [[c for i in range(100)] for i in range(100)]\n",
    "plot_array(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0, 0, 255)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "color(blue=255)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAACFElEQVR4nO3SwQ3AIBDAsNL9dz6WIEJC9gR5ZM3MB6f9twN4k7FIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLhLFIGIuEsUgYi4SxSBiLxAYhCgSN2aqNlwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=200x200 at 0x7F70CB1D6490>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def empty_screen(w=100,h=100):\n",
    "    white = [255,255,255]\n",
    "    res = [ [white for i in range(h)] for j in range(w)]\n",
    "    return res\n",
    " \n",
    "s = empty_screen(100,100)\n",
    "plot_array(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAACHElEQVR4nO3UwQnAMBADQTuk/5YvTWQxmJkK9Fi0Z2bB357TA7iTsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEjsteb0Bi7ksUi847AIeCwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiLxAa1uB4trKPL+AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=200x200 at 0x7F709DEF5D90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "blue = color(red=0,blue=255,green=0)\n",
    "for i in range(100):\n",
    "    s[i][55] = blue\n",
    "plot_array(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAACJElEQVR4nO3UwQnAMAwEQTuk/5aVIpIlYGb+Aj2W2zOz4GvX3w9wJmGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGR2GvN3z9wIItF4h6DRcBikRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZHYb45n5qs/OIzFIrGtDoUH9jMNg/ZcTccAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=200x200 at 0x7F709DEF5AC0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "s[0][0] = color(0,0,0)\n",
    "s[1][0] = color(0,0,0)\n",
    "for j in range(2, 10):\n",
    "    s[j][0] = color(0,0,0)\n",
    "plot_array(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAACO0lEQVR4nO3UsQ2AMBAEwQfRf1kuC9EEK0vWTHDxRXvNWjNzz1j74z7zvgN/u3cf4EyKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUioVgkFIuEYpFQLBKKRUKxSCgWCcUi8cxauz9woA/70sqqv+8UuQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=200x200 at 0x7F70B84604C0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "s = empty_screen(100,100)\n",
    "for i in range(100):\n",
    "    for j in range(100):\n",
    "        s[i][j] = [i*2,j*2,j*2]\n",
    "plot_array(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAACHElEQVR4nO3SsQ2AQAzAwIT9d34WQEIgubvr3XlnZmbOOfPd7mq1j64fDbwyFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5EwFgljkTAWCWORMBYJY5G4AdDHH43LnYEbAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=200x200 at 0x7F70C8143970>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "s = empty_screen(100,100)\n",
    "for i in range(100):\n",
    "    for j in range(100):\n",
    "        if i % 10 != 0:\n",
    "            s[i][j] = [255,255,255]\n",
    "        else:\n",
    "            s[i][j] = [0,0,0]\n",
    "plot_array(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAACWElEQVR4nO3aMYrDQBBFwdHiexudXA4mWTD2Sl4/BKLqBB08ftTLtm0Dvmdd1jHG7ewzuI6Z1H27jzF+zj6Ga7JYfMHvrZosFgmLxb88b9VksUhYLD70aqsmi0XCYnHY+62aLBYJi8UBe7ZqslgkLBa77N+qyWKRsFj84ehWTRaLhMXipc+2arJYJBavyRQsFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBYJYZEQFglhkRAWCWGREBaJ29kHcDXrso4xHmZ7JKNzRSPMAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=200x200 at 0x7F70B8519A60>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "s = empty_screen(100,100)\n",
    "white = [255,255,255]\n",
    "purple = [128,0,128]\n",
    "for i in range(100):\n",
    "    s[i][i]= purple\n",
    "    if i>=10:\n",
    "        s[i-10][i-10]=white \n",
    "    plot_array(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "import math\n",
    "def sine(angle):\n",
    "    return math.sin((angle/360.0)*2*math.pi)\n",
    "def cosine(angle):\n",
    "    return math.cos((angle/360.0)*2*math.pi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [],
   "source": [
    "def cannon(angle,speed,time, gravity=9.8):\n",
    "    x = speed*time*cosine(angle)\n",
    "    y = speed*time*sine(angle) - (gravity/2.0)*(time**2)\n",
    "    return round(x,3),round(y,3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.0, 5.1)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cannon(90,10,1,gravity=9.8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1414.214, 1414.214)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cannon(45,10,200,gravity=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(866.025, 500.0)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cannon(30,10,100,gravity=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(342.02, 939.693)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cannon(70,10,100,gravity=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(707.107, 217.107)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cannon(45,100,10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1414.214, -545.786)"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cannon(45,100,20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(866.025, 10.0)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cannon(30,100,10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(500.0, 376.025)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cannon(60,100,10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [],
   "source": [
    "def draw_cannon(angle,speed,g=9.8):\n",
    "    s = empty_screen(100,50)\n",
    "    x =0\n",
    "    y =0\n",
    "    t=0.0\n",
    "    while x<100 and y>=0 and y<50:\n",
    "        s[x][y] = [0,0,255]\n",
    "        (x,y) = cannon(angle,speed,t,g)\n",
    "        x= int(x)\n",
    "        y = int(y)\n",
    "        s[x][y] = [255,0,0]\n",
    "        t += 1.0/speed\n",
    "        plot_array(s)\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [],
   "source": [
    "import math\n",
    "def sine(angle):\n",
    "    return math.sin((angle/360.0)*2*math.pi)\n",
    "def cosine(angle):\n",
    "    return math.cos((angle/360.0)*2*math.pi)\n",
    "\n",
    "# (x,y) position of cannon shot at angle theta, at speed m/s, after t seconds\n",
    "# with gravitational constant gravity\n",
    "def cannon(theta,speed,t, gravity=9.8):\n",
    "    x = speed*t*cosine(theta)\n",
    "    y = speed*t*sine(theta) - (gravity/2.0)*(t**2)\n",
    "    return round(x,3),round(y,3)\n",
    "\n",
    "def draw_cannon(theta,speed,g=9.8):\n",
    "    s = empty_screen(100,50)\n",
    "    x =0\n",
    "    y =0\n",
    "    t=0.0\n",
    "    while x<100 and y>=0 and y<50:\n",
    "        s[x][y] = [0,0,255]\n",
    "        (x,y) = cannon(theta,speed,t,g)\n",
    "        x= int(x)\n",
    "        y = int(y)\n",
    "        s[x][y] = [255,0,0]\n",
    "        t += 1.0/speed\n",
    "        plot_array(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAIAAABM5OhcAAAB80lEQVR4nO3d3U6jYABFUZjM+79y56JeMMFGKN3yt9YDGDSHHb5W7fh4PAY2GsdhGAY/yYm/e1/AJZjUzJ+9L4BrMiwShkXCsEgYFgnDImFYJAyLhGGRMCwShkXCsEgYFgnDImFYJAyLhGGRMCwShkXCsEgYFgnDImFYJAyLhGGRMCwShkXCsEgYFgnDImFYJAyLhGGRMCwShkXCsEgYFgnDImFYJAyLhGGRMCwShkXCsEgYFgnDImFYJAyLhGGROOgnrD4/C3fOR5mehWKR2LlYa8ukZGehWCR2KNa0OmtLs6Rk6nUEikXil4pVF2X6NdXrCBSLRFisvcqhXkegWCTGR3AjH60TR7ueO1AsEh8u1pHbcORrux7FIvGxU+GzB0cuwfy0eOSrPTvFIvGBYp3x7n9e7Rmv/CwUi8SmYp39jtetjmKReLNYV7rLdaugWCRWF+vVb51fg259imKRWPFe4R3ea7vD9/g7FIvE6mesa9/H0xMiWygWiUXFuttZyStb2ykWiR+Kdee7Vre2UCwSL4vlZDSlW2spFokfnrHco17Zeo9ikfimWJ4n5pwQ11IsEv8Vy5PEErq1hGKR+OYZy734ihPicopF4qtYnhuWc0JcQrFIGBYJwyIxDsNj8KzwLn/V84pikUj+a/LtOCLO/ANlaIDBrbOTNQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=200x100 at 0x7F7075170D30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "draw_cannon(theta=60, speed=10, g=1.62)\n",
    "# 1.62 = gravitational constant of the moon\n",
    "# 9.8 = gravitational constant of Earth\n",
    "# higher speed or lower gravitational constant means cannon can rise higher before crashing down\n",
    "# lower speed or higher gravitational constant means crashes sooner!"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}