{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 行列と幾何変換 I\n",
    "\n",
    "本日の授業では、行列を使って平面上の点のリストの扱いを勉強します。特に、行列を道具として点の幾何変換を行います。\n",
    "\n",
    "点の幾何変換とは、点の実数倍、平行移動、回転などの変換です。\n",
    "\n",
    "\n",
    "## 内容の概要\n",
    "\n",
    "- 1回目：平面上の点とグラフの表示、線形変換\n",
    "- 2回目：アフィン変換、同次座標系"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. 平面上の点とグラフの表示\n",
    "\n",
    "Pythonでは、matplotlib.pyplotというモジュールを導入することで点の表示ができます。\n",
    "\n",
    "使い方：\n",
    "\n",
    "- matplotlib.pyplot.plot(点のｘ座標のリスト, 点のｙ座標のリスト, プロットのフォーマット)\n",
    "\n",
    "<blockquote>\n",
    "matplotlib.pyplot.plot(...)<br>\n",
    "と書くのは長いので、matplotlib.pyplotを導入する行において<br>\n",
    "import matplotlib.pyplot as plt<br>\n",
    "とすると、asに続く文字列で省略表記を定義することができます。\n",
    "</blockquote>\n",
    "\n",
    "### 例1：点のリストを描く\n",
    "\n",
    "２つの点(1,0)と(3,1)を赤丸で表示するために、以下のコードを使用します。\n",
    "\n",
    "<pre>\n",
    "import matplotlib.pyplot as plt\n",
    "plt.plot([1,3], [0,1], 'ro')\n",
    "</pre>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "#２つの点の表示、markersizeによって点のサイズを調整できます。\n",
    "plt.plot([1,3], [0,1], 'ro', markersize=20)\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### ｘ軸とｙ軸のアスペクト比\n",
    "\n",
    "以下の命令によって、ｘ軸とｙ軸のアスペクト比を１にすることができます。\n",
    "\n",
    "``\n",
    "plt.axes().set_aspect('equal')\n",
    "``\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.axes().set_aspect('equal')\n",
    "\n",
    "plt.plot([1,3], [0,1], 'ro', markersize=20)\n",
    "plt.grid()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "行列を使って、点列を描画します。\n",
    "\n",
    "### 点のリストとNumpyの行列\n",
    "\n",
    "これからの計算では、$n$個の点からなる点列を$2\\times n$の形の行列で表現します。そうすると、行列の各列は点列の点に対応します。\n",
    "行列として処理する場合、Pythonライブラリにあるnumpyを使うと便利です。\n",
    "\n",
    "\n",
    "numpyでは、「:」は「すべて」の意味をもっています。即ちここでは、「すべての行」または「すべての列」です。\n",
    "\n",
    "例: p_list = np.array([[0, 1, 1], [0, 0, 1]])について、\n",
    "\n",
    "列を取るために「すべての行」を使います。\n",
    "- p_list[:,0] はp_listのすべての行、第0列を示しています。即ち、点列の0番目(0から数える)の点です。\n",
    "- p_list[:,1] はp_listのすべての行、第1列を示しています。即ち、点列の1番目(0から数える)の点です。\n",
    "- p_list[:,2] はp_listのすべての行、第2列を示しています。即ち、点列の2番目(0から数える)の点です。\n",
    "\n",
    "行を取るために「すべての列」を使います。\n",
    "- p_list[0,:] はp_listのすべての列、第0行を示しています。即ち、すべての点のｘ座標のリストです。\n",
    "- p_list[1,:] はp_listのすべての列、第1行を示しています。即ち、すべての点のｙ座標のリストです。\n",
    "\n",
    "### 例2：三角形を描く\n",
    "\n",
    "３つの点(0,0), (1,0), (1,1)が作る三角形を描いてみます。ｘ軸とｙ軸のアスペクト比を１とします。\n",
    "\n",
    "閉じている多角形を描くためには、点のリストの最後にはじめの点を入れる必要があります。即ち、点(0,0), (1,0), (1,1), (0,0)というリストが必要です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "p_listの0行目(x座標) [0 1 1 0]\n",
      "p_listの1行目(y座標) [0 0 1 0]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "p_list = np.array([[0, 1, 1, 0],\n",
    "                   [0, 0, 1, 0]])\n",
    "print(\"p_listの0行目(x座標)\",p_list[0,:])\n",
    "print(\"p_listの1行目(y座標)\",p_list[1,:])\n",
    "\n",
    "plt.axes().set_aspect('equal')\n",
    "plt.plot(p_list[0,:], p_list[1,:], 'r-')\n",
    "plt.grid()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 「家」の輪郭を描く\n",
    "\n",
    "以下の三角の点列と四角の点列を使って、シンプルな「家」を描くことができます。\n",
    "閉じている多角形を描くために、点のリストの最後にはじめの点を入れる必要があることに注意してください。\n",
    "\n",
    "- roof_nodes：(-3,2),(3,2),(0,3) \n",
    "- wall_nodes：(-2,2),(-2,0),(2,0),(2,2)\n",
    "\n",
    "### 点の並び方と行列の転置\n",
    "\n",
    "以下のコードでは、点の入力を楽にするために行列の転置を使っています。\n",
    "\n",
    "roof_nodesの点のリストを用意するとき、一点ずつ書き並べる方が簡単なので、縦の行列を先に作成します。その後に、次のコードで行列の転置を行います。\n",
    "``\n",
    "roof_nodes = roof_nodes.T\n",
    "``\n",
    "\n",
    "### 例3：「家」を描く\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "roof_nodes = np.array([[-3,2],[3,2],[0,3],[-3,2]])\n",
    "roof_nodes = roof_nodes.T\n",
    "wall_nodes = np.array([[-2,2],[-2,0],[2,0],[2,2],[-2,2]])\n",
    "wall_nodes = wall_nodes.T\n",
    "\n",
    "plt.axes().set_aspect('equal')\n",
    "\n",
    "#家の描画\n",
    "plt.plot(roof_nodes[0,:], roof_nodes[1,:], 'ro-')\n",
    "plt.plot(wall_nodes[0,:], wall_nodes[1,:], 'ro-')\n",
    "plt.grid()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習1\n",
    "\n",
    "上記の「家」の例とは異なる、自分なりの「家」を描いてください。\n",
    "\n",
    "適当に窓やドアを追加しても良いです。その場合、家のそれぞれの構成部分のために点のリストを用意してください。\n",
    "\n",
    "例えば、window_nodes、door_nodes。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "#ここにコードを書いてください。\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 線形変換\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.1  拡大・縮小変換"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "点の$x$座標または$y$座標を実数倍することで、図形の拡大と縮小ができます。\n",
    "\n",
    "$x$方向に$\\alpha$倍にする変換\n",
    "\n",
    "\n",
    "$$\n",
    "x'=\\alpha x,\\ y' = y \\iff\n",
    "\\left(\\begin{array}{c} x' \\\\ y' \\end{array}\\right) = A_x \n",
    "\\left(\\begin{array}{c} x \\\\ y \\end{array}\\right), \\quad \n",
    "A_x=\\left(\\begin{array}{cc} \\alpha & 0 \\\\ 0 & 1 \\end{array}\\right)\n",
    "$$\n",
    "\n",
    "$y$方向に$\\beta$倍にする変換\n",
    "\n",
    "$$\n",
    "x'=x,\\ y' = \\beta y \\iff\n",
    "\\left(\\begin{array}{c} x' \\\\ y' \\end{array}\\right) = A_y \n",
    "\\left(\\begin{array}{c} x \\\\ y \\end{array}\\right), \\quad \n",
    "A_y=\\left(\\begin{array}{cc} 1 & 0 \\\\ 0 & \\beta \\end{array}\\right) \n",
    "$$\n",
    "\n",
    "$x$方向に$\\alpha$倍、$y$方向に$\\beta$倍にする変換\n",
    "\n",
    "$$\n",
    "x'=\\alpha x,\\ y' = \\beta y \\iff\n",
    "\\left(\\begin{array}{c} x' \\\\ y' \\end{array}\\right) = A \n",
    "\\left(\\begin{array}{c} x \\\\ y \\end{array}\\right), \\quad \n",
    "A=\\left(\\begin{array}{cc} \\alpha & 0 \\\\ 0 & \\beta \\end{array}\\right) = A_x A_y\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 例：\n",
    "\n",
    "以下の例では、「家」を$x$方向に$2$倍、$y$方向に$1.5$倍に伸ばしています。変換前の家は赤、変換後の家は青で描かれています。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f4fc5606d60>]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWoAAACcCAYAAABWZOFTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAS+ElEQVR4nO3df4wc5X3H8ffXZzA5G3yuDFeC7btAwBENxgmXBIOCz1AhEhwIIolAB2mCpUtNSqiapApYrdQ/rDZtlDRScYQJphK+BBFjfiS1U1KZNU3BgB3OBkOdADIHhsQQejjnk8/c+ds/Zi/ns/f37uw8M/d5Sau7nd2Z+T5+dj43+8x6H3N3REQkXNOSLkBEREpTUIuIBE5BLSISOAW1iEjgFNQiIoGbHsdG586d652dnTWte/DgQWbOnNnYghKSlbZkpR2gtoQoK+2A+tqyY8eOt9391IIPunvDbxdccIHX6rHHHqt53dBkpS1ZaYe72hKirLTDvb62ANu9SKZq6ENEJHAKapkS+vqgsxMuvXQpnZ3RfZG0iGWMWiQkfX3Q2wvDwwDGq69G9wF6epKsTKQyOqOWTBsbg298YzykJwwPw+23J1OTSLV0Ri2ZMjYG/f2Qy0W3xx+HAwcKP3dgAK65Brq7o9t558E0nbpIgBTUkmqlgvmcc+C662DjRnj77ePXnTkTnnsOHnoouj9nDixdquCW8CioJVUqCebu7ihw3//+aPkllxw9Rh1pbYU774zGqF97DbZundimgltCo6CWoNUSzMcav2C4ahUMDDgLFhirV08snz8fbrghuoGCW8KjoJagNCKYC+npiW653Fa6u7tLPlfBLaFRUEui4grmRlJwS9IU1NJUaQjmchTc0mwKaolVFoK5HAW3xE1BLQ01FYK5HAW3NJqCWuqiYC5PwS31qjiozawF2A7sc/fl8ZUkIVMw10/BLdWq5oz6VuBF4JSYapEAjY3Bnj2z2LFDwRyXaoL7kksmgvvIkUTKlQRUFNRmNg+4ElgN/E2sFUmiCp8xdwEK5mYpF9wPPxwtP/nki7n00ongXrRIZ9xZZdHEAmWeZLYB+EfgZOAbhYY+zKwX6AVob2+/4L777qupoKGhIWbNmlXTuqFJQ1vGxuCll2axc2cb/f1t7NrVxsGD0d/v+fOHOf/8QT70od/yiU8cYu7cwwlXW7809Ek5+/fPYOfONp55Zia7d5/KG2+8D4CTT36PRYveZfHiQRYvHuTMM4dSEdxZ6JNx9bRl2bJlO9y9q+CDxaZ+Gb8By4E1+d+7gZ+VW0dTcUVCbMvoqPv27e7f+Y778uXup5ziDtHtnHPce3vdf/Qj9337JtYJsR21ymJbBgbc773XfcUK97POmujPOXPcr77a/Xvfc3/2WfexsQSLLSGLfVILSkzFVcnQx8XAVWb2aeAk4BQzW+/uN9T0Z0OaShf/sq/SoZJjx7g1VJIeZYPa3W8DbgMws26ioQ+FdKAUzKLgzh59jjrlFMxSjoI7/aoKanfPAblYKpGKKJilXgru9NEZdeAUzBI3BXf4FNSBUTBL0hTc4VFQJ0zBLKFTcCdPQd1kCmZJOwV38ymoY6ZglqxTcMdPQd1gRwfzAw98mN27FcwytVQb3PPmzaOtTcFdioK6TqXOmOfPb1Uwy5RXPrg/yB136Iy7FAV1lUoF88KFcP31E8G8Z8/TZWe8Fplqjg3u++9/ksOHl2iopAQFdRnVBPPpp09ed8+e5tYqkkannTZCd7fGuEtRUB+jnmAWkfrp4uTxpnxQK5hFwqbgnoJBrWAWSbepGNyZD2oFs0i2TYXgzlxQK5hFprYsBnfqg1rBLCKlZCG4UxfUCmYRqUcqg7vYZIo+MbntScDTwE5gN/AP5dapZXLblSvdW1rc4Yi3tET33UtPxrpwoftXvuL+4x+7v/FGTfNJxqJYW9IqE5OPrl/v3tHhR8zcOzqi+ymX9n7Jd4mbHQmqS2qZLLgRbaHE5LaVBLUBs/K/nwA8BVxYap1qg3rlyol/jKNvCxakI5iPVqwtaQ7rtAeCr1/v3to6uUNaW8NJhhqluV/S1CXlgrunx/2kk+pvS6mgtujxyphZK/BLYKW7P1XseV1dXb59+/aKtzt9ejSkUcrChekYysjlij82e3bTymio0dH3mD79hKTLqN2Bd8GPHL/cpsEpKe0U0t0vBw5EkXasGTNgyZLm11ON116Dl18u/7yODti7t/LtmtkOd+8q9FhFY9Rm1gLsAD4I3FEopM2sF+gFaG9vJ1cqsY4xNraU6MT9WM6iRe/+8d4771S8yQTNplhbRkfL/DUKlDuMjo4mXUaVHBsdw0ZHmeZOwT5xZ2zkEN7SUvjxwKWzXyLuhf/NR0acd9559/gVAjJzZjRePW7XrsLH/MCAk8ttbcg+qz2jbgMeBG5x9+eLPa9RZ9QtLZC212GW2jIul8ul48ulRkbg0UfhJz+JrggdOABtbfDee3Dw4PHPN4vSbs4c+Oxn4QtfgMsugxPScZaamn4poLMTXn31+OXVnoWGoFFtKXVGXdU1THcfBB4DrqhmvXJ6e6tbHrIstSUVRkbgpz+FL34RTjsNrroqun/ttbBpE/zud3DnndDaOnm91la45x545BG48kp44AH41KegvR1uugl+/vMo4CUWq1cX7pLVq5Oppx5NaUuxwevxG3Aq0Jb//X3AfwPLS63TyE99pNHEBcX0t8U9wItWhw65P/KI+403Tlxtbmtz//KX3Tdtch8ZOX6dcp/6GN/mDTdMbHPOnGibmze7Hz7clKZVI7h+qdL69e4zZkTHSUif+qhFCJ/6WAQ8C+wCngf+vtw6tQT1uLS/+MYtXep+/vn/l3QZDRFEn9QSzgVU1JaUhHYQ/VKnLB0n7vX1SamgLnsx0d13AR9p4Em8SGWKjTlfey18/vPRePKJJzZ+vzNmwGc+E93Ga7j//mh45J57UjumLemVuv+ZKBmXVDgXo9CWACioJXmhhXMxCm1JiIJakpGWcC5GoS1NpKCW5kl7OBej0JaYKaglXlkN52IU2hIDBbU03lQL52IU2tIgCmppDIVzaZWE9jXXTPxbKbTlKApqqZ3CuTbFQnvDBli3TqEtx1FQS3UUzo2l0JYKKKilLDt8OPqiI4VzvKoNbZkyFNRS2FFnzhdv3Bh9TajCuXkqCO2FF14Ihw7pTHsKUFDLhCLDGm998pOc/rWvKZyTUiS0T33wQdi8WcMjU4CCeqqrYMx5zxNPcHpKv6A+c44K7f959FGWjoxoTHsKUFBPRbogmAl+4olw+eW6EDkFKKinCoVztunTI5mmoM4yhfPUpNDOnLJzJprZfDN7zMxeMLPdZnZrMwqTMm6+OZpJ1yz6efPN0fJK5hBcty6aH7BcSOf3sXTZssn7kGT19UFnJ0svvTSaWbWvr/hzx0P73nth//6JOSI3bJiYI3LFiuPniMzvg2nTyu9D4lds6hefmIrrdOCj+d9PBn4NnFtqHU3FFfMUQxOTMk6+nX12XdNUVbSPlE8AmfrX1/r17q2tk/uktbX6SfqKTTd2003u3/xmY/ZRAU3FNYE6p+J6E3gz//sfzOxF4AzghZj+dkg5a9cWXv6b30Q/P/e5iWGNN9+E9eur38eddxZe/oMfwJYt1W8vEB8fHj5+yug0efllGB2dvGx4GG69NXo3Va1ly+Cii6Lhkc2bo3dbhQwPw6pV0NNT/T6kblWNUZtZJ9H8iU8VeKwX6AVob28nl8vVVNDQ0FDN64ZkcHAxY2NjsbRl6dgYVuoJGzZEt7js2RPftmOW4ogu7fe/j4YwYuQDA2xt8Os5zuMkCXHll0Vn3BU80WwWsBVY7e4bSz23q6vLt2/fXlNBuVyO7gx8Zre7GwYHB+nvb2v8xqdPh7Gx45e3tMArrzRmH2eeGf8+EvDkk0+yZMmSpMuo3UUXwb59xy8/4wx44ol499HRAXv3NmYfebEeJwmoJ7/MbIe7dxV6rKIzajM7AXgA6CsX0tIEvb3REESh5QsWpGcfCRh55ZVU18+3vx31wfDwxLLW1mh5o9pVbB+rVzdm+1K1Sj71YcDdwIvu/t34S5Ky1qyBlSujs1uIfq5cGS1v9D4Aj2sfUr2enugaxYwZUb90dET3Gzl2PL6Pjo7oU0Vx7EOqUskZ9cXAjcBzZtafX3a7u2+KrSopb82a+ENzzRp44QXeHRykrb8/3n1J5Xp64K674u2Xnh4Fc0Aq+dTHL6H0tSsREYlP2aEPERFJloJaRCRwCmoRkcApqEVEAqegFhEJnIJaRCRwCmoRkcApqEVEAqegFhEJnIJaRCRwCmoRkcApqEVEAqegFhEJnIJaRCRwCmoRkcApqEVEAqegFhEJXCVzJq4zs/1m9nwzChIRkckqOaP+d+CKmOsQEZEiyga1uz8OvNOEWkREpIBKZiGviJn1Ar0A7e3t5HK5mrYzNDRU87ohGRxczNjYWOrbsnhwMBPtGJeV11dW+iUrx8m4uF5fDQtqd18LrAXo6ury7u7umraTy+Wodd2QtLXB4OBg+tvS1paNduRl5fWVlX7JzHGSF9frS5/6EBEJnIJaRCRwlXw878fAk8BCM3vdzFbEX5aIiIwrO0bt7tc3oxARESlMQx8iIoFTUIuIBE5BLSISOAW1iEjgFNQiIoFTUIuIBE5BLSISOAW1iEjgFNQiIoFTUIuIBE5BLSISOAW1iEjgFNQiIoFTUIuIBE5BLSISOAW1iEjgKgpqM7vCzPaY2Utm9q24i0q7vj7Ytg127pxNZ2d0P5XyDZm9cyfpbkjGZKRfMnOcNEElU3G1AHcAnwLOBa43s3PjLiyt+vqgtxdGRgCMV1+N7qfuRXhUQwxIb0MyJiP9kpnjpEnKTsUFfBx4yd1fATCz+4CrgRfiLCytVq2C4eHJy4aHYcUKuOuuZGqqybazYOQ/Ji8bBm6cBl/tT6KihhgdncX06f1Jl1G7A/PBC/TLipMgRa+vbdvGQ3rC8HB0/PT0JFNTyCoJ6jOA1466/zrwiWOfZGa9QC9Ae3s7uVyupoKGhoZqXjcEAwNLITrXmWRkxBkcfLf5BdWobeRQ4Qf8CKOjo80tpoHcPdX1T/cjhR8YOcTg4GBTa6nHyMhsCh0nAwNOLre1+QU1SFz5VUlQV8Td1wJrAbq6ury7u7um7eRyOWpdNwQLFkTvRo/V0WH097c1vZ6adX6pWENg795mV9MwaX990dlZvF/69za7mpoVa8aCBZbq/onr9VXJxcR9wPyj7s/LL5MCVq+G1tbJy1pbo+WpkpmGZExG+iUjzWiaSoL6GeBsM/uAmZ0IXAc8Em9Z6dXTA2vXRic4Zk5HR3Q/deNuRzXEzUhvQzImI/2SmeOkScoGtbuPAn8F/CfwInC/u++Ou7A06+mJRge2bNnK3r0pfvHlG7J1yxbS3ZCMyUi/ZOY4aYKKxqjdfROwKeZaRESkAHP3xm/U7C2gwKWCiswF3m5gOUnKSluy0g5QW0KUlXZAfW3pcPdTCz0QS1DXw8y2u3tX0nU0QlbakpV2gNoSoqy0A+Jri77rQ0QkcApqEZHAhRjUa5MuoIGy0pastAPUlhBlpR0QU1uCG6MWEZHJQjyjFhGRoyioRUQCF2xQm9ktZva/ZrbbzP456XrqYWZfNzM3s7lJ11IrM/uXfH/sMrMHzawt6ZqqkZXJL8xsvpk9ZmYv5I+NW5OuqV5m1mJmz5rZz5KupR5m1mZmG/LHyYtmtqRR2w4yqM1sGdF3Xp/v7n8GfCfhkmpmZvOBy4GBpGup0y+AD7v7IuDXwG0J11OxjE1+MQp83d3PBS4Evpritoy7lejrKdLu+8DP3f1DwPk0sE1BBjWwEvgndx8BcPf9CddTj+8Bfwuk+qqtuz+a/94XgG1E36KYFn+c/MLdDwPjk1+kjru/6e6/yv/+B6IwOCPZqmpnZvOAK4EfJl1LPcxsNnAJcDeAux9298FGbT/UoD4H+KSZPWVmW83sY0kXVAszuxrY5+47k66lwW4CNiddRBUKTX6R2nAbZ2adwEeApxIupR7/SnQiU2RGhNT4APAWcE9+GOeHZjazURtv2MQB1TKz/wL+tMBDq4jq+hOit3YfA+43szM9wM8SlmnH7UTDHqlQqi3u/nD+OauI3n5rdrsEmdks4AHgr939QNL11MLMlgP73X2HmXUnXE69pgMfBW5x96fM7PvAt4C/a9TGE+Huf17sMTNbCWzMB/PTZnaE6MtO3mpWfZUq1g4zO4/or+xOM4NoqOBXZvZxd/9tE0usWKk+ATCzLwHLgctC/KNZQqYmvzCzE4hCus/dNyZdTx0uBq4ys08DJwGnmNl6d78h4bpq8TrwuruPv7vZQBTUDRHq0MdDwDIAMzsHOJGUfbuWuz/n7qe5e6e7dxJ15EdDDelyzOwKoreoV7n7cLnnByYzk19Y9Ff/buBFd/9u0vXUw91vc/d5+ePjOmBLSkOa/HH9mpktzC+6jAZOAJ7YGXUZ64B1ZvY8cBj4i5SdwWXRvwEzgF/k3yFsc/e/TLakyrj7qJmNT37RAqxL8eQXFwM3As+ZWX9+2e3574yXZN0C9OVPBl4BvtyoDeu/kIuIBC7UoQ8REclTUIuIBE5BLSISOAW1iEjgFNQiIoFTUIuIBE5BLSISuP8HkXZKttpAOz8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "roof_nodes = np.array([[-3,2],[3,2],[0,3],[-3,2]]).T\n",
    "wall_nodes = np.array([[-2,2],[-2,0],[2,0],[2,2],[-2,2]]).T\n",
    "\n",
    "plt.axes().set_aspect('equal')\n",
    "\n",
    "#変換前の家\n",
    "plt.plot(roof_nodes[0,:], roof_nodes[1,:], 'ro-')\n",
    "plt.plot(wall_nodes[0,:], wall_nodes[1,:], 'ro-')\n",
    "plt.grid()\n",
    "\n",
    "#変換行列\n",
    "A = np.array([[2,0],[0,1.5]])\n",
    "\n",
    "#変換後の家\n",
    "new_roof_nodes = np.dot(A,roof_nodes)\n",
    "new_wall_nodes = np.dot(A,wall_nodes)\n",
    "plt.plot(new_roof_nodes[0,:], new_roof_nodes[1,:], 'bo-')\n",
    "plt.plot(new_wall_nodes[0,:], new_wall_nodes[1,:], 'bo-')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習2\n",
    "\n",
    "演習1で考えた「家」を、$x$方向と$y$方向に適当に伸ばして描いてください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "#ここにコードを書いてください。\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## レポート課題\n",
    "\n",
    "演習1で考えた「家」をベースにして、拡大・縮小変換によって２つのサイズの異なる「家」を描いてください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "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.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
