{ "metadata": { "name": "", "signature": "sha256:010d4ca05a26174b0f188bd024c5a2bbb8f10f11082dd40e3acce71333f2e735" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "##EE16A: Homework 2\n", "This notebook contains the code for Homework problem 2.5.\n", "\n", "###Problem 2.5\n", "The function below draws a line given the starting and ending points." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "from pylab import *\n", "import math\n", "\n", "def plot_line(start_point, end_point, color):\n", " x_coords = [start_point[0], end_point[0]]\n", " y_coords = [start_point[1], end_point[1]]\n", " plot(x_coords, y_coords, color, linewidth=2)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this problem we will revisit homework 0 where we rotated a house by an angle $\\theta$. Besides rotating, we want to also be able to move the house around and change its size. To accomodate this, we need to use a vector in $\\mathbb{R}^3$ to specify points, where the third entry is always 1. So we will represent $\\begin{bmatrix} x \\\\ y\\end{bmatrix}$ by $\\begin{bmatrix} x \\\\ y \\\\ 1\\end{bmatrix}$ instead. As we will see, this allows for a translation to be written as a transformation matrix.\n", "\n", "\n", "####2.5(a) Rotational Matrix\n", "Recall that the rotation matrix from homework 0 is\n", "$$\\begin{bmatrix} \\cos\\theta & -\\sin\\theta \\\\ \\sin\\theta & \\cos\\theta \\end{bmatrix}$$\n", "This rotates a vector of the form $\\begin{bmatrix}x \\\\ y \\end{bmatrix}$ by angle $\\theta$. \n", "\n", "Now we want to use a vector space in $\\mathbb{R}^3$ such that the third entry is always 1, $\\begin{bmatrix}x \\\\ y \\\\ 1\\end{bmatrix}$. How can we modify the rotation matrix such that it behaves the same way? Write the new $3\\times3$ rotation matrix in the code below.\n", "\n", "$$\\begin{bmatrix} \\cos\\theta & -\\sin\\theta & ? \\\\ \\sin\\theta & \\cos\\theta & ? \\\\ ? & ? & ?\\end{bmatrix} \\begin{bmatrix}x \\\\ y \\\\ 1 \\end{bmatrix} = \\begin{bmatrix} x\\cos\\theta - y\\sin\\theta \\\\ x\\sin\\theta + y\\cos\\theta \\\\ 1\\end{bmatrix}$$\n", "\n", "\n", "####2.5(b) Scaling Matrix\n", "Now we also want to scale the house. To both rotate and scale, we will first apply the rotation matrix to the vector, then we will apply the scaling matrix. Insert a scaling matrix in the code below, where the house is stretched 2 times horizontally and 1.5 times vertically. Do not forget to change use_scaling to True.\n", "\n", "$$\\begin{bmatrix} ? & ? & ? \\\\ ? & ? & ? \\\\ ? & ? & ?\\end{bmatrix} \\begin{bmatrix}x \\\\ y \\\\ 1 \\end{bmatrix} = \\begin{bmatrix} s_xx \\\\ s_yy \\\\ 1\\end{bmatrix}$$\n", "\n", "\n", "####2.5(c) Translation Matrix\n", "To be able to implement a translation of the image, we need to add a shift of $t_x$ to the $x$-coordinate and a shift of $t_y$ to the $y$-coordinate. The third entry of the vector will be used as a constant in the matrix multiplication to implement the shift.\n", "Implement a translation matrix in the code below and change use_translate to True.\n", "\n", "$$\\begin{bmatrix} ? & ? & ? \\\\ ? & ? & ? \\\\ ? & ? & ?\\end{bmatrix} \\begin{bmatrix}x \\\\ y \\\\ 1 \\end{bmatrix} = \\begin{bmatrix} x + t_x \\\\ y + t_y \\\\ 1\\end{bmatrix}$$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "figure(figsize=(10,10))\n", "\n", "#YOUR CODE HERE: Define a rotational matrix (part a)\n", "theta = pi/6\n", "rotation_matrix = np.eye(3) # replace this\n", "\n", "#YOUR CODE HERE: Define a scaling matrix (part b)\n", "scale_x = 2\n", "scale_y = 1.5\n", "scaling_matrix = []\n", "use_scale = False # Change to True for part b\n", "\n", "#YOUR CODE HERE: Define a translation matrix (part c)\n", "translate_x = -1\n", "translate_y = -3\n", "translate_matrix = []\n", "use_translate = False # Change to True for part c\n", "\n", "#Only for making the legend\n", "plot([10,20], 'r'); plot([10,20], 'g'); legend(['Original', 'Transformed'])\n", "\n", "#Plotting the coordinate system\n", "plot([-3,3], [0,0], 'k', linewidth=1)\n", "plot([0,0], [-3,3], 'k', linewidth=1)\n", "\n", "#Plotting each line of the house, and rotating each separately\n", "start_point = [0, 0, 1]\n", "end_point = [1, 0, 1]\n", "plot_line(start_point, end_point, 'r')\n", "\n", "start_point = np.dot(rotation_matrix, start_point)\n", "end_point = np.dot(rotation_matrix, end_point)\n", "if (use_scale):\n", " start_point = np.dot(scaling_matrix, start_point)\n", " end_point = np.dot(scaling_matrix, end_point)\n", "if (use_translate):\n", " start_point = np.dot(translate_matrix, start_point)\n", " end_point = np.dot(translate_matrix, end_point)\n", "plot_line(start_point, end_point, 'g')\n", "\n", "start_point = [0, 0, 1]\n", "end_point = [0, 1, 1]\n", "plot_line(start_point, end_point, 'r')\n", "\n", "start_point = np.dot(rotation_matrix, start_point)\n", "end_point = np.dot(rotation_matrix, end_point)\n", "if (use_scale):\n", " start_point = np.dot(scaling_matrix, start_point)\n", " end_point = np.dot(scaling_matrix, end_point)\n", "if (use_translate):\n", " start_point = np.dot(translate_matrix, start_point)\n", " end_point = np.dot(translate_matrix, end_point)\n", "plot_line(start_point, end_point, 'g')\n", "\n", "start_point = [1, 0, 1]\n", "end_point = [1, 1, 1]\n", "plot_line(start_point, end_point, 'r')\n", "\n", "start_point = np.dot(rotation_matrix, start_point)\n", "end_point = np.dot(rotation_matrix, end_point)\n", "if (use_scale):\n", " start_point = np.dot(scaling_matrix, start_point)\n", " end_point = np.dot(scaling_matrix, end_point)\n", "if (use_translate):\n", " start_point = np.dot(translate_matrix, start_point)\n", " end_point = np.dot(translate_matrix, end_point)\n", "plot_line(start_point, end_point, 'g')\n", "\n", "start_point = [1, 1, 1]\n", "end_point = [0.5, 2, 1]\n", "plot_line(start_point, end_point, 'r')\n", "\n", "start_point = np.dot(rotation_matrix, start_point)\n", "end_point = np.dot(rotation_matrix, end_point)\n", "if (use_scale):\n", " start_point = np.dot(scaling_matrix, start_point)\n", " end_point = np.dot(scaling_matrix, end_point)\n", "if (use_translate):\n", " start_point = np.dot(translate_matrix, start_point)\n", " end_point = np.dot(translate_matrix, end_point)\n", "plot_line(start_point, end_point, 'g')\n", "\n", "start_point = [0, 1, 1]\n", "end_point = [0.5, 2, 1]\n", "plot_line(start_point, end_point, 'r')\n", "\n", "start_point = np.dot(rotation_matrix, start_point)\n", "end_point = np.dot(rotation_matrix, end_point)\n", "if (use_scale):\n", " start_point = np.dot(scaling_matrix, start_point)\n", " end_point = np.dot(scaling_matrix, end_point)\n", "if (use_translate):\n", " start_point = np.dot(translate_matrix, start_point)\n", " end_point = np.dot(translate_matrix, end_point)\n", "plot_line(start_point, end_point, 'g')\n", "\n", "xlim([-3,3]); ylim([-3,3])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ "(-3, 3)" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAk8AAAJPCAYAAABlxzBuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X+U3XV95/HXZ0hCgpIsGJAEQqxtdyuuQTg5rLLWzqr4\n66gtVRQOpItS8dhKC4or9VcmLIhr5ay1nnahtUXqAY8H3S6IihxksFYqqyssFZUfGiMEYRNCQgg0\nQD77B3OnCSRhPnPvzNyZeTzOyTn3zv3e+/3k5ubmmff9zndKrTUAAIzNwFQvAABgOhFPAAANxBMA\nQAPxBADQQDwBADQQTwAADbqKp1LK/FLKd0spN5dSbiulXNCrhQEA9KPS7XmeSin71Vq3lVLmJPl2\nkrNrrd/uyeoAAPpM1x/b1Vq3jVycl2SfJA90+5gAAP2q63gqpQyUUm5Ocl+S62utt3W/LACA/tSL\nydOOWuuLkxyW5OWllMGuVwUA0Kfm9OqBaq2bSylXJ1mZZLjz9VKKH54HAEwbtdayt9u7iqdSyuIk\nj9daHyylLEhyXJI1u1lEN7uh0dDQUIaGhqZ6GbOK53zylVK8t0wyr/PJ5zmffKXstZuSdD95WpLk\nc6WUgTz5EeDf1Vqv6/IxAQD6VlfxVGu9NcnRPVoLAEDfc4bxGWhwcHCqlzDreM6ZDbzOJ5/nvD91\nfZLMZ9xBKdVxCUCvOeYJmAgj7y0Td8A4AMwGYzmImOlnvP8BE08AMAYmnTNLN0HsmCcAgAbiCQCg\ngXgCAGggngBglrngggvyzne+s+fbPpOBgYH89Kc/7cljTSWnKgCmJacqYDL1++vtkksuyYUXXpif\n/vSnWbhwYY4//vhccMEFWbRo0VQvbRcDAwO588478/znP3+ql7LHP9OxnKrA5AkAprELL7ww55xz\nTi688MJs2bIl//RP/5Sf//znOe644/LYY489bfsnnnhiClY5s4gnAJimtmzZkqGhoXzmM5/Jq1/9\n6uyzzz5Zvnx5vvjFL2bt2rX5/Oc/n6GhobzlLW/JqlWrsmjRolxyySUZGhrKqlWrRh/n0ksvzfLl\ny7N48eKcd955ed7znpdvfvObSbLLtmvXrs3AwMDo9gcddFA+9rGPjT7OTTfdlJe+9KU54IADsnTp\n0pxxxhm7DbjpTjwBwDT1ne98J48++mh+93d/d5evP+tZz8rrX//6XHvttSml5Morr8wJJ5yQzZs3\n5+STT97lHEe33XZb/vAP/zCXX3557r333mzevDnr168fvX1350P6x3/8x9x+++257rrrcu655+Yn\nP/lJkmTOnDn5sz/7s2zcuDE33nhjrrvuuvzFX/zFBP3up454AoBuldKbX402bNiQxYsXZ2Dg6f+c\nL1myJBs2bEiSHHvssXnTm96UJJk/f/4ux/pcccUVedOb3pRjjz02c+fOzbnnnrtLMO3uuKDVq1dn\n3333zYoVK3LkkUfm5ptvTpIcffTROeaYYzIwMJDly5fn9NNPzw033ND8++p3zjAOAN2aooPJFy9e\nnA0bNmTHjh1PC6j169dn8eLFSZLDDjtsj4+xfv36XW5fsGBBnvOc5+x1v4cccsjo5f322y8PP/xw\nkuT222/Pe9/73nz/+9/Ptm3b8vjjj2flypXNv69+Z/IEANPUS1/60uy777750pe+tMvXt27dmq9/\n/et51atelWTvP4pk6dKlufvuu0evP/LII9m4ceO41vPud787RxxxRO68885s3rw5559/fnbs2DGu\nx+pn4gkApqlFixZl9erVOeOMM3LNNdfksccey9q1a/PWt741y5YtyymnnPKMp1h485vfnKuuuio3\n3nhjtm/fnqGhoXGflmHr1q3Zf//9s99+++XHP/5x/vIv/3Jcj9PvxBMATGPvf//787GPfSxnn312\nFi1alJe85CVZvnx5rrvuusybNy+llKdNnnb+2gtf+ML8+Z//eU488cQsXbo0+++/fw4++ODsu+++\nT9u2c31PPvnJT+ayyy7LwoULc/rpp+fEE08c832nEyfJBKalfj9pITPLbHq9bd26NQcccEDuvPPO\nLF++fKqXM2GcJBMAGLerrroq27Zty8MPP5yzzz47K1asmNHh1C3xBACz3JVXXplDDz00hx56aO66\n66584QtfmOol9TUf2wHT0mz6GIWp5/U28/jYDgBgkognAIAG4gkAoIF4AgBoIJ4AABqIJwBg3O67\n7768/OUvz8KFC/P+979/qpezi7Vr12ZgYKDnP19vTk8fDQCYNM9+9rNHf+TJww8/nPnz52efffZJ\nklx88cU56aSTJnwNF198cQ4++OBs2bJlwvfVL8QTAExTW7duHb38K7/yK/nsZz+bV7ziFU/b7vHH\nH8+cORPzT/7Pf/7zvOAFLxjXfSdyXRPJx3YAMMMMDw/nsMMOyyc+8YksWbIkp512Wh588MG84Q1v\nyMEHH5wDDzwwb3zjG3PPPfeM3mdwcDAf/ehH87KXvSwLFy7Ma17zmmzcuDFJ8uijj+aUU07J4sWL\nc8ABB+SYY47J/fffn1NPPTWXXnppPvGJT2T//ffPN7/5zWzfvj1nnnnm6BnLzzrrrGzfvn2363rH\nO96RNWvW5IQTTsiqVauycOHCrFixInfccUcuuOCCPPe5z83y5ctz7bXXjq5z8+bNOe2007J06dIc\ndthh+chHPjL6sdyOHTty9tln56CDDsqv/uqv5uqrr56Q51c8AcAMdN9992XTpk1Zt25dLrroouzY\nsSOnnXZa1q1bl3Xr1mXBggV5z3ves8t9Lr/88lxyySW5//77s3379nzyk59Mknzuc5/Lli1bcvfd\nd+eBBx7IRRddlAULFuSSSy7JySefnA984AN56KGH8opXvCLnnXdebrrpptxyyy255ZZbctNNN+W8\n887b7bouvvji1Frzla98Jb/3e7+XTZs25aijjspxxx2XJFm/fn0+8pGP5F3vetfo/U899dTMmzcv\nd911V37wgx/kG9/4Rv76r/86yZMfIV599dW5+eab873vfS9XXHHF6MeavTT9ZmUA0GfKmt78A11X\n9+5HwAwMDGTNmjWZO3du5s6dm/nz5+f4448fvf2DH/zgLh/xlVLy9re/Pb/2a7+WJHnrW9+aK6+8\nMkkyb968bNy4MXfccUde9KIX5aijjtp13Tv9mJPLLrssn/nMZ7J48eIkyerVq/Oud70r55577m7X\nlSQvf/nLR4PpLW95S7785S/nnHPOSSklb3vb23L66adny5YteeSRR/K1r30tDz74YObPn58FCxbk\nzDPPzF/91V/l9NNPzxe/+MWcddZZOfTQQ0d/jzfccEPPntMO8QQAXepl9PTKQQcdlHnz5o1e37Zt\nW84666xcc8012bRpU5Inj5mqtY5OZw455JDR7RcsWDB6TNWqVavyi1/8IieeeGIefPDBnHLKKTn/\n/PN3e7zS+vXrs3z58tHrhx9+eNavX7/HdSXJwQcfvMt+Fy9ePLqmBQsWjK717rvvzmOPPZYlS5aM\nbr9jx44cfvjhSZJ77703y5Yt22XfE8HHdgAwAz3146oLL7wwt99+e2666aZs3rw5N9xwQ2qtY/qB\nx3PmzMlHP/rR/PCHP8x3vvOdfOUrX8mll166222XLl2atWvXjl5ft25dli5dusd1tXystmzZsuy7\n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\nNBBPAAANxBMAQAPxBADQQDwBADQYdzyVUv5rKeWWUsrNpZTrSinLerkwAIB+1M3k6RO11iNrrS9O\n8vdJVvdoTXRpeHh4qpcw63jOmQ28zief57w/jTueaq0P7XT12Uk2dL8cesFftsnnOWc28DqffJ7z\n/jSnmzuXUs5PsirJtiQv6cmKAAD62F4nT6WUa0spt+7m1xuTpNb6oVrr4UkuSfLfJ2G9AABTqtRa\nu3+QUg5P8tVa67/fzW3d7wAAYJLUWsvebh/3x3allF+vtd4xcvW3k/xgPAsAAJhOxj15KqVckeTf\nJXkiyV1J3l1rvb+HawMA6Ds9+dgOAGC2mJQzjDuh5uQrpfxpKeVHI8/7l0spi6Z6TTNdKeWEUsoP\nSylPlFKOnur1zFSllNeWUn5cSrmjlPKBqV7PbFBK+ZtSyn2llFunei2zRSllWSnl+pH3lH8upfzR\nVK9ppiulzC+lfHekVW4rpVywx20nY/JUStm/c16oUsoZSY6stf7+hO94FiulHJfkulrrjlLKx5Ok\n1nrOFC9rRiul/EaSHUkuSvK+Wuv/meIlzTillH2S/CTJq5Lck+R/Jzmp1vqjKV3YDFdK+c0kW5Nc\nWmt90VSvZzYopRyS5JBa682llGcn+X6S3/Fan1illP1qrdtKKXOSfDvJ2bXWbz91u0mZPDmh5uSr\ntV5ba90xcvW7SQ6byvXMBrXWH9dab5/qdcxwxyS5s9a6ttb6WJIv5MlvWGEC1Vr/IcmmqV7HbFJr\n/WWt9eaRy1uT/CjJ0qld1cxXa902cnFekn2SPLC77SbtBwOXUs4vpaxL8p+TfHyy9kuS5B1JvjrV\ni4AeODTJL3a6fvfI12DGKqU8L8lRefI/wkygUspAKeXmJPclub7WetvutuvqDONP2eG1SQ7ZzU0f\nrLVeVWv9UJIPlVLOyZMn1Hx7r/Y9Wz3Tcz6yzYeSbK+1Xjapi5uhxvKcM6F8hwuzyshHdlck+eOR\nCRQTaOQTmxePHCd8TSllsNY6/NTtehZPtdbjxrjpZTEF6Ylnes5LKacmeX2SV07KgmaBhtc5E+Oe\nJDt/w8myPDl9ghmnlDI3yZeSfL7W+vdTvZ7ZpNa6uZRydZKVSYafevtkfbfdr+90dY8n1KR3Simv\nTfL+JL9da310qtczCzk57MT4XpJfL6U8r5QyL8nbklw5xWuCniullCSfTXJbrfVTU72e2aCUsriU\n8m9GLi9Iclz20CuT9d12Tqg5yUopd+TJA946B7vdWGv9gylc0oxXSjk+yaeTLE6yOckPaq2vm9pV\nzTyllNcLYZTCAAAAg0lEQVQl+VSePJjzs7XWPX47Mb1RSrk8yW8leU6S+5N8tNb6t1O7qpmtlPKy\nJN9K8n/zrx9X/0mt9etTt6qZrZTyoiSfy5ODpYEkf1dr/dPdbuskmQAAYzdp320HADATiCcAgAbi\nCQCggXgCAGggngAAGognAIAG4gkAoIF4AgBo8P8BO7jEKZ6BrwMAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }