{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# EE16A Discussion 2B" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualizing Matrices as Operations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This exercise is going to help you visualize matrices as operations. For example, when we multiply a vector by a rotation matrix, we will see it \"rotate\" in the true sense here. Similarly, when we multiply a matrix by a scalar matrix, we will see it \"scale\". The way we will see this is by applying the operation to all the vertices of a polygon and seeing how the polygon changes.\n", "Let's first do the necessary imports and define some useful functions to do this." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "\"\"\"Function that takes the vertices of a polygon and applies a matrix \"transformation\" to each of them, effectively\n", "\"transforming\" the polygon.\"\"\"\n", "def transform_the_polygon(polygon, T):\n", " \n", " transformed_polygon = []\n", " for point in polygon:\n", " transformed_point = np.dot(T, point)\n", " transformed_polygon.append(transformed_point)\n", " return transformed_polygon\n", "\n", "\"\"\"Function that plots a polygon in the x-y plane, given its vertices as x-y coordinates. The plot is defined in terms\n", "of line segments connecting all adjacent vertices of the polygon.\"\"\"\n", "def plot_the_polygon(polygon):\n", " fig = plt.figure(figsize=(5,5))\n", " ax = fig.add_subplot(111, xlim = [-4, 4], ylim = [-4, 4])\n", " for i in range(len(polygon) - 1):\n", " ax.plot([polygon[i][0], polygon[i+1][0]],\n", " [polygon[i][1], polygon[i+1][1]], linewidth=4)\n", " ax.plot([polygon[i+1][0], polygon[0][0]], [polygon[i+1][1], polygon[0][1]], linewidth=4)\n", " ax.grid(True)\n", " ax.axhline(y=0, color='k', linestyle = '--', linewidth = 2)\n", " ax.axvline(x=0, color='k', linestyle = '--', linewidth = 2)\n", " #plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we define our starting polygon, a square whose side is of length 1. Let's see what the square looks like." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbUAAAGyCAYAAABjr1plAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3X9wXeV9JvDnGwsKSqKNCY6dSBYdYCTAsKEmP+yapM11\nrBK3OknTBZcm08bepKVY2cYa7P5Ii+XMpiAnuWQxod0tSgObWiSZKQ6d3WAHSJvYhdCRmjSMLCkJ\nCbKdFixII+JLFozf/eNeUf2wZOk95+g9z6vnM3PH+FrX53l4j/31vXrvueacg4iISAxeETqAiIhI\nVjTUREQkGhpqIiISDQ01ERGJhoaaiIhEQ0NNRESioaEmIiLR0FATEZFoaKiJiEg0NNRERCQaCzbU\nzOyPzOyUmZUX6pgiIrK4LMhQM7M3A/hdAN9eiOOJiMjilPtQM7NXAfg8gA8C+Pe8jyciIovXQjxT\n+wyAv3POPbwAxxIRkUWsLs/f3Mx+E8CVAN6U53FERESAHIeamTUB+DSAdzrnXpzjY14L4FcA/BDA\nz/LKJiIihXcOgJ8HsN8598xcH2R5fUiomb0bwN8CeAmA1e5eAsDV7vs5N+XgZvZbAP4ml0AiIsLo\nfc65vXP94jxffnwQwBVT7vscgMMAbp060Gp+CACf//zncemll+YYLT/btm3DbbfdFjpGKuwd2PNf\nc801OH78OJYtW4YHHnggdBwv7GsA8Hdgz3/48GG8//3vB2pzYa5yG2rOuRMABibeZ2YnADzjnDs8\nw8N+BgCXXnopVq9enVe0XC1ZsoQ2+zj2Duz5zz777Jd/ZO3BvgYAfwf2/BPM61tRC31FkXxe6yyQ\ngYGBM39RwbF3YM8fgxjWgL0De35fCzrUnHMl51znQh5zoV1xxdRXXPmwd2DP/9BDD2HNmjV46KGH\nQkfxxr4GAH8H9vy+dO3HjJ177rmhI6TG3oE9f2trK5YtW4bW1tbQUbyxrwHA34E9vy8NtYxdf/31\noSOkxt6BPT/A34E9P8DfgT2/r9y29Psws9UA+vr6+mL5BqeIiHjo7+/HVVddBQBXOef65/o4PVPL\nWHd3d+gIqbF3YM8P8Hdgzw/wd2DP70tDLWOVSiV0hNTYO7DnB/g7sOcH+Duw5/ellx9FRKRw9PKj\niIgserlepV9E5q9cLmNsbAwNDQ3o7Iz6bZ0imdMztYyNjo6GjpAaewf2/OVyGbt27UK5XA4dxRv7\nGgD8Hdjz+9JQy9iWLVtCR0iNvQN7/hjEsAbsHdjz+9JQy1hXV1foCKmxd2DPH4MY1oC9A3t+Xxpq\nGYth1yZ7B/b8MYhhDdg7sOf3paEmIiLR0FATEZFoaKhlrKenJ3SE1Ng7sOePQQxrwN6BPb8vDbWM\n9ffP+Y3vhcXegT1/S0sLli5dipaWltBRvLGvAcDfgT2/L10mS0RECkeXyRIRkUVPQ01ERKKhoSYi\nItHQUMtYkiShI6TG3oE9P8DfgT0/wN+BPb8vDbWMdXR0hI6QGnsH9vwAfwf2/AB/B/b8vrT7UURE\nCke7H0VEZNHTUBMpmFKphFWrVqFUKoWOIkJHQy1j+/btCx0hNfYO7PmHh4cxMDCA4eHh0FG8sa8B\nwN+BPb8vDbWM9fb2ho6QGnsH9vwxiGEN2Duw5/eljSIiBdPU1IRjx46hsbERR48eDR1HJAhtFBER\nkUVPQ01ERKKhoSYiItHQUMvY5s2bQ0dIjb0De/4YxLAG7B3Y8/uqCx0gNm1tbaEjpMbegT1/Z2cn\nDh06hHXr1oWO4o19DQD+Duz5fWn3o4iIFI52P4qIyKKnoSYiItHQUMvYwYMHQ0dIjb0De36AvwN7\nfoC/A3t+X7kONTO7wcy+bWY/qd3+0cyuyfOYoe3evTt0hNTYO7DnB/g7sOcH+Duw5/eV60YRM/tV\nAC8B+C4AA/ABANsBXOmcO3yar6ffKFKpVFBfXx86RirsHdjzA/wd2PMD/B3Y8/tuFMl1S79z7v9M\nuetPzez3AawBMG2oxYD5JBrH3oE9P8DfgT0/wN+BPb+vBXufmpm9AsB1AOoBPLJQxxVhMzQ0hJMn\nT6Kurg6tra2h44hQyX2omdnlqA6xcwA8B+DXnXODeR9XhNX69et1lX4RTwux+3EQwBsBvAXAXwC4\nx8wuWYDjBrF9+/bQEVJj78CePwYxrAF7B/b8vnIfas65k865J5xz/+yc+yiAbwP4g9kes3HjRiRJ\nMum2du3aaZ/keuDAASRJMu3xW7duRU9Pz6T7+vv7kSQJRkdHJ92/c+dOdHd3T7pvZGQESZJgcHDy\nE8o9e/ZMO1EqlQqSJHl5+2xzczOA6gf0ne7aa5s2bSp8j/EOrD0eeOCBaduZ2XoAwDPPPEPbY/wc\nmvrng6nHxD8HjD1+8IMfnPHvq6L06O3txYYNG7BixQqUSiUkSYJt27ZNO8ZcLPhlsszsIQBPOue2\nnObX6Hc/iqSlDwkVKejuRzP7cwBfATAC4NUA3gfglwAszittiohIrvLeKPI6AHcDeD2AnwD4FwBt\nzrmHcz6uiIgsQrl+T80590Hn3IXOuXOdcyucc9EPtKmvazNi78CePwYxrAF7B/b8vnTtx4zt2LEj\ndITU2Duw549BDGvA3oE9vy99nlrGRkZGJu2aYsTegT3/0NAQjhw5gpUrV9K++Zp9DQD+Duz5C7lR\nZDFiPonGsXdgz9/a2ko7zMaxrwHA34E9vy+9/CgiItHQUBMRkWhoqGVs6rv9GbF3YM8P8Hdgzw/w\nd2DP70tDLWOVSiV0hNTYO7DnB/g7sOcH+Duw5/el3Y8iIlI4vrsf9UxNRESioS39IgVTLpcxNjaG\nhoYGdHZ2ho4jQkXP1DI29SMWGLF3YM9fLpexa9culMvl0FG8sa8BwN+BPb8vDbWMbdky7RN16LB3\nYM8fgxjWgL0De35fGmoZ6+rqCh0hNfYO7PljEMMasHdgz+9LQy1jMezaZO/Anj8GMawBewf2/L40\n1EREJBoaaiIiEg0NtYz19PSEjpAaewf2/DGIYQ3YO7Dn96WhlrH+/jm/8b2w2Duw529pacHSpUvR\n0tISOoo39jUA+Duw5/ely2SJiEjh6DJZIiKy6GmoiYhINDTUREQkGhpqGUuSJHSE1Ng7sOcH+Duw\n5wf4O7Dn96WhlrGOjo7QEVJj78CeH+DvwJ4f4O/Ant+Xdj+KiEjhaPejiIgsehpqIgVTKpWwatUq\nlEql0FFE6GioZWzfvn2hI6TG3oE9//DwMAYGBjA8PBw6ijf2NQD4O7Dn96WhlrHe3t7QEVJj78Ce\nPwYxrAF7B/b8vrRRRKRgmpqacOzYMTQ2NuLo0aOh44gEoY0iIiKy6GmoiYhINDTUREQkGhpqGdu8\neXPoCKmxd2DPH4MY1oC9A3t+X3WhA8Smra0tdITU2Duw5+/s7MShQ4ewbt260FG8sa8BwN+BPb8v\n7X4UEZHC0e5HERFZ9DTUREQkGrkONTP7YzN7zMzGzOwpM7vPzFryPGZoBw8eDB0hNfYO7PkB/g7s\n+QH+Duz5feX9TO1tAPYAeCuAdwI4C8ABMzs35+MGs3v37tARUmPvwJ4f4O/Anh/g78Ce39eCbhQx\ns/MBPA3g7c65af+MiGGjSKVSQX19fegYqbB3YM8P8Hdgzw/wd2DPz7JR5DUAHIBnF/i4C4b5JBrH\n3oE9P8DfgT0/wN+BPb+vBXufmpkZgE8DOOicG1io44qwGRoawsmTJ1FXV4fW1tbQcUSoLOSbr+8E\ncBkA3neUiiyA9evX6yr9Ip4W5OVHM7sDwEYAv+yc+9czff3GjRuRJMmk29q1a6d96N2BAweQJMm0\nx2/duhU9PT2T7uvv70eSJBgdHZ10/86dO9Hd3T3pvpGRESRJgsHBwUn379mzB9u3b590X6VSQZIk\nL+80Gv/13t7e016mZtOmTYXvMfHXGHtcfPHF03Z+sfUAgGeeeYa2x/iPU/98MPWYuCaMPdavX3/G\nv6+K0qO3txcbNmzAihUrUCqVkCQJtm3bNu0Yc+Kcy/UG4A4ARwBcOIevXQ3A9fX1OVa333576Aip\nsXdgz9/Y2OgAuMbGxtBRvLGvgXP8Hdjz9/X1OVT3YKx285g5ue5+NLM7AVwPIAEw8bPpf+Kc+9lp\nvp5+96NIWvqQUJHi7n68AUADgL8H8KMJt+tyPq6IiCxCuW4Ucc7pMlwiIrJgNHQyNvWbtYzYO7Dn\nj0EMa8DegT2/Lw21jO3YsSN0hNTYO7Dnj0EMa8DegT2/L32eWsZGRkbQ3NwcOkYq7B3Y8w8NDeHI\nkSNYuXIl7Zuv2dcA4O/Ant93o4g++TpjzCfROPYO7PlbW1tph9k49jUA+Duw5/ellx9FRCQaGmoi\nIhINDbWMTb2EDSP2Duz5Af4O7PkB/g7s+X1pqGWsUqmEjpAaewf2/AB/B/b8AH8H9vy+tPtRREQK\np6iXyRIREVkw2tIvUjDlchljY2NoaGhAZ2dn6DgiVPRMLWNTPzeIEXsH9vzlchm7du1CuVwOHcUb\n+xoA/B3Y8/vSUMvYli1bQkdIjb0De/4YxLAG7B3Y8/vSUMtYV1dX6AipsXdgzx+DGNaAvQN7fl8a\nahmLYdcmewf2/DGIYQ3YO7Dn96WhJiIi0dBQExGRaGioZaynpyd0hNTYO7Dnj0EMa8DegT2/Lw21\njPX3z/mN74XF3oE9f0tLC5YuXYqWlpbQUbyxrwHA34E9vy9dJktERApHl8kSEZFFT0NNRESioaEm\nIiLR0FDLWJIkoSOkxt6BPT/A34E9P8DfgT2/Lw21jHV0dISOkBp7B/b8AH8H9vwAfwf2/L60+1FE\nRApHux9FRGTR01ATKZhSqYRVq1ahVCqFjiJCR0MtY/v27QsdITX2Duz5h4eHMTAwgOHh4dBRvLGv\nAcDfgT2/Lw21jPX29oaOkBp7B/b8MYhhDdg7sOf3pY0iIgXT1NSEY8eOobGxEUePHg0dRyQIbRQR\nEZFFT0NNRESioaEmIiLR0FDL2ObNm0NHSI29A3v+GMSwBuwd2PP7qgsdIDZtbW2hI6TG3oE9f2dn\nJw4dOoR169aFjuKNfQ0A/g7s+X1p96OIiBROIXc/mtnbzOx+MztmZqfMbHFeNlpERBZE3t9TeyWA\nbwG4EUBxnhKKiEiUch1qzrkHnHM3O+e+DMDyPFZRHDx4MHSE1Ng7sOcH+Duw5wf4O7Dn96WNIhnb\nvXs3rr766tAxUmHvwJr/Q3fdhcfPPhsAMHTbbWjdtg2X/9u/4a/uuy9wsrn5/o+fQOXFCgDgT//t\neexZcS5+fFEj3n5gMHAyP6zn0Tj2/L401DJ27733ho6QGnsH1vyPn302Hm1urv7kllvw6DnnAM89\nBzz6aNhgc3TRhP/+vwDqn/gpvoNjoeKkxnoejWPP70vvU8tYfX196AipsXdgzw8AOOec0AlSiWAF\n6M8j9vy+CjnUNm7ciCRJJt3Wrl077aMUDhw4gCSZvqFy69at6OnpmXRff38/kiTB6OjopPt37tyJ\n7u7uSfeNjIwgSRIMDk5+2WTPnj3Yvn37pPsqlQqSJJn2+nVvb+9p3/y4adMm9VCP2XuMjACDg8C2\nbRj7/vcn9wBwurfUbgIw9YNGDgA43XbjrQB6ptzXX/va0Sn37wTQPeW+kdrXTn1RcQ+A7VPue/6U\n418PRHJeFbhHb28vNmzYgBUrVqBUKiFJEmzbtm3aMeZiwd6nZmanALzHOXf/LF+j96nJorX2nnuq\nLz9eey0wOgqcfz7WdHXhkY6O0NG8fefCV+GK7z8XOoYQ8n2fWq7fUzOzVwK4GP+x8/FCM3sjgGed\nc0fyPHYo27dvxyc+8YnQMVJh70Cb/9xzp9/36lcDa9YsfBYP33n6cfz0hZ8CAO74d6DjNcDTjfW4\nInAuX7TnUQ17fl95bxR5E4CvofoeNQfgU7X77wawJedjB9E8/o1+YuwdaPNfdBEwNjb5vssvBx55\nJEyeefrdnrV49GhtU8s3gb1vBdY0XYh3h43ljfY8qmHP7yvXoeac+wcU9Pt2efnwhz8cOkJq7B3Y\n80fhraEDpMd+HrHn97WoBo6IiMRNQ01ERKKhoZaxqdtqGbF3YM8fheOhA6THfh6x5/eloZaxHTt2\nhI6QGnsH9vxR+GroAOmxn0fs+X3pMlkZu+OOO0JHSI29A3t+fOpTwNNPA697Xegk/jaGDpAe+3nE\nnt+XhlrGYthGy96BPT+am6s3Zq8JHSA99vOIPb8vvfwoIiLR0FATEZFoaKhlbOrFRhmxd2DPDwDo\n7Q2dIJ0IPp+S/Txiz+9LQy1jlUoldITU2Duw5wcA/OxnoROk82LoAOmxn0fs+X0t2FX650JX6ZfF\nbG1/Px6dcu3HNQ0NeITkz8Laidd+rFnTtAaP/FeOa1dKsfhepV/P1EREJBra0i9SNF/8IlCpAPX1\nwAc/GDqNCBU9U8vY1E94ZcTegT0/vvQl4O67qz+yOhE6QHrs5xF7fl8aahnbsoX/Y+LYO7Dnj8KX\nQwdIj/08Ys/vS0MtY11dXaEjpMbegT1/FH45dID02M8j9vy+NNQyFsOuTfYO7Pmj8IbQAdJjP4/Y\n8/vSUBMRkWhoqImISDQ01DLW09MTOkJq7B3Y80dhzm+VLS7284g9vy8NtYz19/P/aWbvwJ4fK1cC\nr3pV9UdW/xo6QHrs5xF7fl9683XGPvOZz4SOkBp7B/b8KJdDJ0jvV0MHSI/9PGLP70vP1EREJBoa\naiIiEg0NNRERiYaGWsaSJAkdITX2Duz5AQAf/WjoBOnsDR0gPfbziD2/Lw21jHV0dISOkBp7B/b8\nAID3vCd0gnTeEjpAeuznEXt+XxpqGWtrawsdITX2Duz5AQBvfnPoBOlcHDpAeuznEXt+XxpqIiIS\nDb1PTaRoOjuBZ58FzjsPuOuu0GlEqOiZWsb27dsXOkJq7B3Y8+PIEeDJJ6s/sjocOkB67OcRe35f\nGmoZ6+3tDR0hNfYO7Pmj8HjoAOmxn0fs+X1pqGXsC1/4QugIqbF3YM8fhWtDB0iP/Txiz+9LQ01E\nRKKhoSYiItHQUBMRkWhoqGVs8+bNoSOkxt6BPX8UIth4x34esef3pfepZSyGd/Gzd2DPj2uvBR5/\nHLj88tBJ/F0UOkB67OcRe35fuQ81M9sK4CYAKwB8G8CHnXP/lPdxQ7n++utDR0iNvQN7flx3XfXG\n7IrQAdJjP4/Y8/vK9eVHM9sE4FMAdgL4BVSH2n4zOz/P44qIyOKU9/fUtgH4n865e5xzgwBuAFAB\nsCXn44qIyCKU28uPZnYWgKsA/Pn4fc45Z2YPAlib13FDO3jwIK6++urQMVJh78Ca/4nvA1hW+8l3\nvgNccQUefxxYuzVkqrl7fA2A19R+8iSAC2qdSLGeR+PY8/vK83tq5wNYAuCpKfc/BaA1x+MGtXv3\nbvoTib0Da/7K8xN+cu+9wBVX4KfPAY8+GizS/KzCfwy1QwAumNKJDOt5NI49v69C7n685pprcPbZ\nZ5/211paWvDwww/P+vhSqYTh4eEZf72zsxOdnZ0z/vrQ0BDWr18/6zEeeughtLZOn8333nsvAKBc\nLqNcLs/4+CL3GO8AcPaYmH8cQ48TlReBT38CaG4G/uzPZviqcu02kxYAs/cASgBm7gF01m4zGQJw\nmh69x6v/jAWA35o9AcN6nDp1CkNDQ6f9cz6uyD1OnTqFpqYmADP/fTWuiD1eeOGFWY83I+dcLjcA\nZwF4EUAy5f7PAbhvhsesBuBmu1122WVu3P79+117e7ubaunSpbP+Hjt37nz5a2+++WZ36623Tnr8\nV7/61VkfD8A9/vjjzjnnTpw44drb2903vvGNSb/He9/7XvVQj3n3wGc/6/C1rzl85SsOv/iLDtvu\ncoCbcJu9B3DZhK/d74D2KY93Dpi9B7Bzwtfe7IBbpzx+Dj1uhEMX3Cu3vpl6PWI5r4reY+/evW7N\nmjUzPXa1m8fsye2ZmnPuRTPrQ/WfdPcDgJlZ7ee3z/bYZcuWzfhMbfny5S//d1tb22nfi3HllVfO\n+i+GhoaGl/97165d03595cqVaGxsnC0i6uqq/+vq6+tx//33T/v1devW4Zvf/OaMj1eP/6AeVT+q\nvAi3ZAkwMgK89BLwe78HPDf1vWrrAMzcA1g+4b/bareprsTsz9QaJvz39B7ASgCn6VF/HFhS+9d1\nbQuanbWEdj2AOM4roPg9rr/+eqxevXraM7Xjx4/P+PvNxFz1GVIuzOw6VJ+Z3QDgMVR3Q/4XAJc4\n56alNbPVAPr6+vqwevXq3HKJFNEldw3h2NkncOIj74L78dOwpa/Dsj/6Oi68j+Nb0E+s+hAqr578\nmTONdZdj8BN/FSiRMOvv78dVV10FAFc55/rn/MD5PK3zuQG4EcAPATwP4BEAb5rla1cDcH19fdOe\n2rK46aabQkdIjb0De/7GxkYHwDU2NoaO4o19DZzj78Cev6+vr1gvP04YmncCuDPv4xRFc3Nz6Aip\nsXdgzx+DGNaAvQN7fl+5vvw4X3r5UQRoamrCsWPH0NjYiKNHj4aOIxKE78uPukq/iIhEQ0NNRESi\noaGWscHBwdARUmPvwJ4/BjGsAXsH9vy+NNQytmPHjtARUmPvwJ4/BjGsAXsH9vy+tFEkYyMjI/S7\njtg7sOcfGhrCkSNHsHLlylkvbVRk7GsA8Hdgz++7UaSQ135kxnwSjWPvwJ6/tbWVdpiNY18DgL8D\ne35fevlRRESioaEmIiLR0FDLWHd3d+gIqbF3YM8P8Hdgzw/wd2DP70tDLWOVSiV0hNTYO7DnB/g7\nsOcH+Duw5/el3Y8iIlI4ukyWiIgsetrSL1Iw5XIZY2NjaGhoQGdnZ+g4IlT0TC1jo6OjoSOkxt6B\nPX+5XMauXbtQLpdDR/HGvgYAfwf2/L401DK2ZcuW0BFSY+/Anj8GMawBewf2/L401DLW1dUVOkJq\n7B3Y88cghjVg78Ce35eGWsZi2LXJ3oE9fwxiWAP2Duz5fWmoiYhINDTUREQkGhpqGevp6QkdITX2\nDuz5YxDDGrB3YM/vS0MtY/39c37je2Gxd2DP39LSgqVLl6KlpSV0FG/sawDwd2DP70uXyRIRkcLR\nZbJERGTR01ATEZFoaKiJiEg0NNQyliRJ6AipsXdgzw/wd2DPD/B3YM/vS0MtYx0dHaEjpMbegT0/\nwN+BPT/A34E9vy/tfhQRkcLR7kcREVn0NNRECqZUKmHVqlUolUqho4jQ0VDL2L59+0JHSI29A3v+\n4eFhDAwMYHh4OHQUb+xrAPB3YM/vS0MtY729vaEjpMbegT1/DGJYA/YO7Pl9aaOISME0NTXh2LFj\naGxsxNGjR0PHEQlCG0VERGTR01ATEZFoaKiJiEg0chtqZvYnZnbIzE6Y2bN5HadoNm/eHDpCauwd\n2PPHIIY1YO/Ant9XXY6/91kAvgjgEQBbcjxOobS1tYWOkBp7B/b8nZ2dOHToENatWxc6ijf2NQD4\nO7Dn95X77kcz+x0AtznnzpvD12r3o4iIaPejiIiIhpqIiERjXkPNzG4xs1Oz3F4ys5a8wjI4ePBg\n6AipsXdgzw/wd2DPD/B3YM/vzTk35xuA1wJoOcOtbspjfgfAs3P8/VcDcMuXL3ft7e2TbmvWrHH3\n3Xefm2j//v2uvb3dTXXjjTe6u+66a9J9fX19rr293R0/fnzS/TfffLO79dZbJ9335JNPuvb2dnf4\n8OFJ999+++3upptumnTfiRMnXHt7u/vGN77hnHMv59m7d6/7wAc+MC3bddddV/geE7Mw9li+fPnL\n68Ha413vetek84qtx/hxp/75YOox8ZiMPS6//PIz/n1VlB579+5173znO93y5cvdO97xDtfe3u7e\n/va3OwAOwGo3jzmljSIZq1QqqK+vDx0jFfYO7PkB/g7s+QH+Duz5fTeK5Lal38xWAjgPwAUAlpjZ\nG2u/9D3n3Im8jhsa80k0jr0De36AvwN7foC/A3t+X3m+T+1jAH57ws/HJ+07AHw9x+OKUBsaGsLJ\nkydRV1eH1tbW0HFEqOQ21JxzmwEszre0i6Swfv16XaVfxJO29Gds+/btoSOkxt6BPX8MYlgD9g7s\n+X1pqGWsubk5dITU2Duw549BDGvA3oE9vy99SKhIwehDQkV0mSwRERENNRERiYeGWsYGBwdDR0iN\nvQN7/hjEsAbsHdjz+9JQy9iOHTtCR0iNvQN7/hjEsAbsHdjz+9JGkYyNjIzQ7zpi78Cef2hoCEeO\nHMHKlStp33zNvgYAfwf2/IW7TNZixXwSjWPvwJ6/tbWVdpiNY18DgL8De35fevlRRESioaEmIiLR\n0FDLWHd3d+gIqbF3YM8P8Hdgzw/wd2DP70tDLWOVSiV0hNTYO7DnB/g7sOcH+Duw5/el3Y8iIlI4\nukyWiIgsetrSL1Iw5XIZY2NjaGhoQGdnZ+g4IlT0TC1jo6OjoSOkxt6BPX+5XMauXbtQLpdDR/HG\nvgYAfwf2/L401DK2ZcuW0BFSY+/Anj8GMawBewf2/L401DLW1dUVOkJq7B3Y88cghjVg78Ce35eG\nWsZi2LXJ3oE9fwxiWAP2Duz5fWmoiYhINDTUREQkGhpqGevp6QkdITX2Duz5YxDDGrB3YM/vS0Mt\nY/39c37je2Gxd2DP39LSgqVLl6KlpSV0FG/sawDwd2DP70uXyRIRkcLRZbJERGTR01ATEZFoaKiJ\niEg0NNQyliRJ6AipsXdgzw/wd2DPD/B3YM/vS0MtYx0dHaEjpMbegT0/wN+BPT/A34E9vy/tfhQR\nkcLR7kcREVn0NNRECqZUKmHVqlUolUqho4jQ0VDL2L59+0JHSI29A3v+4eFhDAwMYHh4OHQUb+xr\nAPB3YM/vS0MtY729vaEjpMbegT1/DGJYA/YO7Pl9aaOISME0NTXh2LFjaGxsxNGjR0PHEQlCG0VE\nRGTR01ATEZFo5DLUzOwCM7vLzJ4ws4qZfdfMuszsrDyOJyIiAuT3TO0SAAbgQwAuA7ANwA0APp7T\n8Qpj8+bNoSOkxt6BPX8MYlgD9g7s+X3V5fGbOuf2A9g/4a4fmtknUR1sO/I4ZlG0tbWFjpAaewf2\n/J2dnTg5egnrAAAPmklEQVR06BDWrVsXOoo39jUA+Duw5/e1YLsfzey/A2hzzr1llq/R7kcRESn2\n7kczuxhAB4C/XIjjiYjI4jSvoWZmt5jZqVluL5lZy5THNAL4CoAvOOc+m2V4ERGRieb7TO2TqG4C\nmel2KYAnxr/YzN4A4GEAB51zvzfXg2zcuBFJkky6rV27dtplXw4cOHDazwzaunUrenp6Jt3X39+P\nJEkwOjo66f6dO3eiu7t70n0jIyNIkgSDg4OT7t+zZw+2b98+6b5KpYIkSXDw4EEAePnH3t7e036j\ndtOmTYXvMd6BtcfVV189qQNjjwcffHDSecXWYzz31D8fTD0mZmbs8ZGPfOSMf18VpUdvby82bNiA\nFStWoFQqIUkSbNu2bdox5sQ5l8sNQCOAIQCfR+17d3N4zGoArq+vz7Fqb28PHSE19g7s+Z3j78Ce\n3zn+Duz5+/r6HAAHYLWbx+zJZaNI7RnaPwD4AYAPAHhpwhB9apbH0W8UqVQqqK+vDx0jFfYO7PkB\n/g7s+QH+Duz5fTeK5LKlH8AGABfWbkdq9xmqU3dJTscsBOaTaBx7B/b8AH8H9vwAfwf2/L7yep/a\n3QDuzuP3Fond0NAQTp48ibq6OrS2toaOI0Ilr2dqIuJp/fr1ukq/iCdd0DhjU3cbMWLvwJ4/BjGs\nAXsH9vy+NNQy1tzcHDpCauwd2PPHIIY1YO/Ant+XPiRUpGD0IaEiBb9MloiIyELQUBMRkWhoqGVs\n6qVqGLF3YM8fgxjWgL0De35fGmoZ27GD/+Pi2Duw549BDGvA3oE9vy9tFMnYyMgI/a4j9g7s+YeG\nhnDkyBGsXLmS9s3X7GsA8Hdgz1+0y2QtWswn0Tj2Duz5W1tbaYfZOPY1APg7sOf3pZcfRUQkGhpq\nIiISDQ21jE39AD9G7B3Y8wP8HdjzA/wd2PP70lDLWKVSCR0hNfYO7PkB/g7s+QH+Duz5fWn3o4iI\nFI4ukyUiIouetvSLFEy5XMbY2BgaGhrQ2dkZOo4IFT1Ty9jo6GjoCKmxd2DPXy6XsWvXLpTL5dBR\nvLGvAcDfgT2/Lw21jG3ZsiV0hNTYO7Dnj0EMa8DegT2/Lw21jHV1dYWOkBp7B/b8MYhhDdg7sOf3\npaGWsRh2bbJ3YM8fgxjWgL0De35fGmoiIhINDTUREYmGhlrGenp6QkdIjb0De/4YxLAG7B3Y8/vS\nUMtYf/+c3/heWOwd2PO3tLRg6dKlaGlpCR3FG/saAPwd2PP70mWyRESkcHSZLBERWfQ01EREJBoa\naiIiEg0NtYwlSRI6QmrsHdjzA/wd2PMD/B3Y8/vSUMtYR0dH6AipsXdgzw/wd2DPD/B3YM/vS7sf\nRUSkcLT7UUREFj0NNZGCKZVKWLVqFUqlUugoInQ01DK2b9++0BFSY+/Ann94eBgDAwMYHh4OHcUb\n+xoA/B3Y8/vSUMtYb29v6AipsXdgzx+DGNaAvQN7fl/aKCJSME1NTTh27BgaGxtx9OjR0HFEgijc\nRhEz+7KZPWlmz5vZj8zsHjN7fV7HExERyfPlx4cBXAugBcB7AVwE4Es5Hk9ERBa5urx+Y+fc/5jw\n0yNmdiuA+8xsiXPupbyOKyIii9eCbBQxs/MAvA/AodgH2ubNm0NHSI29A3v+GMSwBuwd2PP7yu2Z\nGgDUnp11AKgH8AiAX8vzeEXQ1tYWOkJq7B3Y83d2duLQoUNYt25d6Cje2NcA4O/Ant/XvHY/mtkt\nAP5wli9xAC51zg3Xvv48AOcBuADATgBjzrkZB5t2P4qICLBwux8/CeCSWW6XAnhi/Iudc886577n\nnHsIwPUANprZW890kI0bNyJJkkm3tWvXTnsz4YEDB057JeqtW7eip6dn0n39/f1IkgSjo6OT7t+5\ncye6u7sn3TcyMoIkSTA4ODjp/j179mD79u2T7qtUKkiSBAcPHpx0f29v72mf/m/atEk91EM91EM9\nJvTo7e3Fhg0bsGLFCpRKJSRJgm3btk07xlws2PvUzKwZwA8B/LJz7uszfI2eqYmISLHep2ZmbzGz\nrWb2RjNrNrMSgL0Avovq99aiNfVfQIzYO7DnB/g7sOcH+Duw5/eV1+7HCqrvTXsQwCCAvwLwLVSf\npb2Y0zELYffu3aEjpMbegT0/wN+BPT/A34E9vy9dJitjlUoF9fX1oWOkwt6BPT/A34E9P8DfgT1/\noV5+XMyYT6Jx7B3Y8wP8HdjzA/wd2PP7yvV9aiIyf0NDQzh58iTq6urQ2toaOo4IFQ01kYJZv369\nrtIv4kkvP2Zs6vtCGLF3YM8fgxjWgL0De35fGmoZa25uDh0hNfYO7PljEMMasHdgz+9Lux9FCkYf\nEiqi3Y8iIiIaaiIiEg8NtYxNvagoI/YO7PljEMMasHdgz+9LQy1jO3bsCB0hNfYO7PljEMMasHdg\nz+9LG0UyNjIyQr/riL0De/6hoSEcOXIEK1eupH3zNfsaAPwd2PP7bhTRm68zxnwSjWPvwJ6/tbWV\ndpiNY18DgL8De35fevlRRESioaEmIiLR0FDL2NSPWmfE3oE9P8DfgT0/wN+BPb8vDbWMVSqV0BFS\nY+/Anh/g78CeH+DvwJ7fl3Y/iohI4egyWSIisuhpS79IwZTLZYyNjaGhoQGdnZ2h44hQ0TO1jI2O\njoaOkBp7B/b85XIZu3btQrlcDh3FG/saAPwd2PP70lDL2JYtW0JHSI29A3v+GMSwBuwd2PP70lDL\nWFdXV+gIqbF3YM8fgxjWgL0De35fGmoZi2HXJnsH9vwxiGEN2Duw5/eloSYiItHQUBMRkWhoqGWs\np6cndITU2Duw549BDGvA3oE9vy8NtYz198/5je+Fxd6BPX9LSwuWLl2KlpaW0FG8sa8BwN+BPb8v\nXSZLREQKR5fJEhGRRU9DTUREoqGhJiIi0dBQy1iSJKEjpMbegT0/wN+BPT/A34E9vy8NtYx1dHSE\njpAaewf2/AB/B/b8AH8H9vy+tPtRREQKR7sfRURk0dNQEymYUqmEVatWoVQqhY4iQkdDLWP79u0L\nHSE19g7s+YeHhzEwMIDh4eHQUbyxrwHA34E9v6/ch5qZnW1m3zKzU2b2n/M+Xmjd3d2hI6TG3oE9\nfwxiWAP2Duz5fS3EM7XdAI4CKM6OlBwtW7YsdITU2Duw549BDGvA3oE9v69ch5qZvQvABgA3AbA8\njyUiIlKX129sZssB/C8ACYDn8zqOiIjIuDyfqf01gDudc/+c4zFEREReNq9namZ2C4A/nOVLHIBL\nAVwD4FUAxr9TOdeXHs8BgMOHD88nVqE89thj9J9jxN6BPf8LL7zw8o+sPdjXAODvwJ5/whw4Zz6P\nm9cVRczstQBee4Yv+wGALwL4tSn3LwFwEsDfOOc2z/D7/xaAv5lzIBERid37nHN75/rFuVwmy8ya\nADRMuOsNAPYD+A0AjznnfjTD414L4FcA/BDAzzIPJiIiLM4B8PMA9jvnnpnrgxbk2o9mdgGqz+Cu\ndM79S+4HFBGRRWkhryiyKN6nJiIi4RTqKv0iIiJp6NqPIiISDQ01ERGJRuGHGvMFkc3sy2b2pJk9\nb2Y/MrN7zOz1oXPNhZldYGZ3mdkTZlYxs++aWZeZnRU623yY2Z+Y2SEzO2Fmz4bOcyZmttXMflA7\nZx41szeHzjRXZvY2M7vfzI7V/rwmoTPNh5n9sZk9ZmZjZvaUmd1nZi2hc82Hmd1gZt82s5/Ubv9o\nZteEzuXLzP6odi6V5/qYwg81cF8Q+WEA1wJoAfBeABcB+FLQRHN3Capvmv8QgMsAbANwA4CPhwzl\n4SxU3zf5F6GDnImZbQLwKQA7AfwCgG8D2G9m5wcNNnevBPAtADeC88/r2wDsAfBWAO9E9dw5YGbn\nBk01P0dQvUDGagBXofp30JfN7NKgqTzU/kH3u6j+OZj744q8UaR2QeRPovr+tgGQvyXAzNoB3Afg\n55xzL4XOM19mdhOAG5xzF4fOMl9m9jsAbnPOnRc6y0zM7FEA33TO/UHt54bqX1K3O+d2Bw03T2Z2\nCsB7nHP3h87iq/aPiacBvN05dzB0Hl9m9gyAm5xzfx06y1yZ2asA9AH4fQB/BuCfnXOdc3lsYZ+p\nTbgg8vsRwQWRzew8AO8DcIhxoNW8BkDhX8JjVHtZ9yoAD43f56r/4nwQwNpQuRa516D6jJPynDez\nV5jZbwKoB/BI6Dzz9BkAf+ece3i+DyzsUEMkF0Q2s1vN7KcARgGsBPCewJG8mNnFADoA/GXoLJE6\nH9VLyT015f6nAKxY+DiLW+1Z8qcBHHTODYTOMx9mdrmZPQfg/wG4E8CvO+cGA8eas9ogvhLAH/s8\nfkGHmpndUvum30y3l8ysxcz+G/wuiJy7uXaY8JDdqC7QBgAvAfjfQYLXeOSHmTUC+AqALzjnPhsm\n+aQ88+4gMk93ovq95N8MHcTDIIA3AngLqt9LvsfMLgkbaW5ql1j8NKrXe3zR6/dYyO+p5X1B5IUw\nxw5POOdOnuaxjah+j2Stc+6beeQ7k/nmN7M3APgagH8M+f99Ip81KPr31GovP1YA/MbE70OZ2ecA\n/Cfn3K+HyuaD+XtqZnYHgHYAb3POjYTOk5aZfRXA95xzvx86y5mY2bsB/C2qTwDGn8wsQfVl4JdQ\n3Y8w69DK7UNCT6d2UcozXpjSzD4M4KMT7hq/IPJ1AB7LJ93czLXDDJbUfvy5jOLM23zy14bwwwD+\nCcCWPHPNR8o1KCTn3Itm1gdgPYD7gZdfAlsP4PaQ2RaT2kB7N4BfimGg1bwCAf/OmacHAVwx5b7P\nATgM4NYzDTRggYfaXDnnjk78uZmdQHVqPzHTFf6LxszeAuDNAA4C+DGAiwF8DMB3QfBN29oztL9H\n9ZnzDgCvq/4dCzjnpn7fp7DMbCWA8wBcAGCJmb2x9kvfc86dCJfstMoAPlcbbo+h+jaKelT/UBee\nmb0S1fN8/F/YF9b+fz/rnDsSLtncmNmdAK4HkAA4UdusBgA/cc5RfGqImf05qt8qGAHwalQ3p/0S\ngLaQueaq9mdy0vcwa3//P+Ocm9MHbRZyqM2guO89OL0Kqu9N60L1/Tv/iurJ9nHf14oX2AYAF9Zu\n438hGarrsGSmBxXQxwD89oSfj39q4jsAfH3h48zMOffF2jbyjwFYjup7vn7FOXc8bLI5exOqL1W7\n2u1TtfvvRoGe6c/iBlRz//2U+zcDuGfB0/h5Har/v18P4CcA/gVAm88uwgKZ19/9hX6fmoiIyHwU\neUu/iIjIvGioiYhINDTUREQkGhpqIiISDQ01ERGJhoaaiIhEQ0NNRESioaEmIiLR0FATEZFoaKiJ\niEg0NNRERCQaGmoiIhKN/w/lfQzO0UmFPAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "unit_square = [np.array([0,0]), np.array([1,0]), np.array([1,1]), np.array([0,1])]\n", "plot_the_polygon(unit_square)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Part 1: Rotation Matrices as Rotations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Code for the following sections:\n", "\n", "(a) Given T1 (15 degree rotation) and T2 (30 degree rotation), describe how to rotate the unit square by 45 degrees. How about 60 degrees?\n", "\n", "(b) Try to rotate the unit squre by 60 degrees using only one matrix." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "ename": "SyntaxError", "evalue": "invalid syntax (, line 15)", "output_type": "error", "traceback": [ "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m15\u001b[0m\n\u001b[0;31m T3 = ?????\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], "source": [ "# R is a \"rotation matrix.\"\n", "# Example:\n", "# angle = np.pi/2 # 90 degrees in radians\n", "# R = np.array([[np.cos(angle), -np.sin(angle)],\n", "# [np.sin(angle), np.cos(angle)]])\n", "\n", "angle1 = np.pi/12 # 15 degrees in radians\n", "T1 = np.array([[np.cos(angle1), -np.sin(angle1)],\n", " [np.sin(angle1), np.cos(angle1)]])\n", "\n", "angle2 = np.pi/6 # 30 degrees in radians\n", "T2 = np.array([[np.cos(angle2), -np.sin(angle2)],\n", " [np.sin(angle2), np.cos(angle2)]])\n", "\n", "T3 = ?????\n", "\n", "rotated_square = transform_the_polygon(unit_square, T3)\n", "plot_the_polygon(rotated_square)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And finally, we can \"reflect\" the square about the y-axis:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "Re_y = np.array([[-1, 0], [0,1]])\n", "reflected_square = transform_the_polygon(unit_square, Re_y)\n", "plot_the_polygon(reflected_square)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Part 2: Commutativity of Operations" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "The next natural question to ask is the following: Does the *order* in which you apply these operations matter?\n", "\n", "a) Let's see what happens to the unit square when we rotate the matrix by 60 degrees, and then reflect it along the y-axis." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# As the name indicates, R_60 rotates the matrix by 60 degrees.\n", "rotation_angle = np.pi/3 # 60 degrees in radians\n", "R_60 = np.array([[np.cos(rotation_angle), -np.sin(rotation_angle)],\n", " [np.sin(rotation_angle), np.cos(rotation_angle)]])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "reflected_after_rotated_square = transform_the_polygon(unit_square, R_60)\n", "reflected_after_rotated_square = transform_the_polygon(reflected_after_rotated_square, Re_y)\n", "plot_the_polygon(reflected_after_rotated_square)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "b) Now, let's reflect *before* rotating." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "rotated_after_reflected_square = transform_the_polygon(unit_square, Re_y)\n", "rotated_after_reflected_square = transform_the_polygon(rotated_after_reflected_square, R_60)\n", "plot_the_polygon(rotated_after_reflected_square)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also scale the square: " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# S is a \"scalar matrix.\"\n", "S = np.array([[2, 0],\n", " [0, 2]])\n", "scaled_square = transform_the_polygon(unit_square, S)\n", "plot_the_polygon(scaled_square)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [default]", "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.5.2" } }, "nbformat": 4, "nbformat_minor": 1 }