{
"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
}