{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 「行列と幾何変換」の解答例\n",
    "\n",
    "伊藤悠河さんのレポートをベースにした解答例です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import math\n",
    "\n",
    "#Cは拡大、縮小変換、Aは回転移動、bは平行移動,color: 家の色設定\n",
    "def my_home(C,A,b,color):\n",
    "    roof_nodes = np.array([[-5,4],[-4,6],[4,6],[5,4],[-5,4]]).T\n",
    "\n",
    "    wall_nodes = np.array([[-4,0],[-4,4],[4,4],[4,0],[-4,0]]).T\n",
    "\n",
    "    door_nodes = np.array([[2,0],[2,2],[3,2],[3,0],[2,0]]).T\n",
    "\n",
    "    window_nodes = np.array([[0,1],[-2,1],[-2,3],[0,3],[0,1],[-1,1],[-1,3]]).T\n",
    "\n",
    "    Entotu_nodes = np.array([[-3,6],[-3,7.5],[-2,7.5],[-2,6],[-3,6]]).T\n",
    "    \n",
    "    roof_nodes = A@C@roof_nodes + b\n",
    "    wall_nodes = A@C@wall_nodes + b\n",
    "    window_nodes = A@C@window_nodes + b\n",
    "    door_nodes = A@C@door_nodes + b\n",
    "    Entotu_nodes = A@C@Entotu_nodes + b\n",
    "    \n",
    "    #家の描画\n",
    "    plt.rcParams['figure.figsize'] = [12, 8]\n",
    "    plt.gca().set_aspect('equal')\n",
    "    \n",
    "    plt.plot(roof_nodes[0,:], roof_nodes[1,:], color+'-')\n",
    "    plt.plot(wall_nodes[0,:], wall_nodes[1,:], color+'-')\n",
    "    plt.plot(door_nodes[0,:], door_nodes[1,:], color+'-')\n",
    "    plt.plot(window_nodes[0,:], window_nodes[1,:], color+'-')\n",
    "    plt.plot(Entotu_nodes[0,:], Entotu_nodes[1,:], color+'-')\n",
    "    plt.grid()\n",
    "\n",
    "#----------------------------------  坂  ------------------------------------------------\n",
    "#坂の描画。楕円を用いる。\n",
    "x = np.linspace(-20, 20, 1001)\n",
    "y = 10*np.sqrt(1 - x**2/400)-11\n",
    "\n",
    "plt.plot(x,y,'k-')\n",
    "plt.grid()\n",
    "#---------------------------------- 家１　　--------------------------------------------------\n",
    "#元々の家。単位行列をかけ、ゼロ行列をたす。\n",
    "E = np.array([[1,0],\n",
    "              [0,1]]).T\n",
    "O = np.array([[0,0]]).T\n",
    "\n",
    "my_home(E,E,O, 'k') #黒色：k\n",
    "\n",
    "#---------------------------------- 家2　　---------------------------------------------------\n",
    "#家を角度alphaで回転し、サイズを1.2倍、(-12,2)の方向で平行移動\n",
    "alpha = 20/180*math.pi\n",
    "C = np.array([[1.2,0],\n",
    "              [0,1.2]])\n",
    "A = np.array([[math.cos(alpha), -math.sin(alpha)],\n",
    "              [math.sin(alpha), math.cos(alpha)]])\n",
    "b = np.array([[-12,-2]]).T\n",
    "\n",
    "my_home(C,A,b,'b') #青色の家\n",
    "\n",
    "#---------------------------------- 家３　　---------------------------------------------------\n",
    "#家を角度alphaで回転し、y方向のサイズを2倍、(18,-5)の方向で平行移動\n",
    "alpha = -45/180*math.pi\n",
    "C = np.array([[1,0],\n",
    "              [0,2]])\n",
    "A = np.array([[math.cos(alpha), -math.sin(alpha)],\n",
    "              [math.sin(alpha), math.cos(alpha)]])\n",
    "b = np.array([[18,-5]]).T\n",
    "\n",
    "my_home(C,A,b,'r') #赤の家\n"
   ]
  },
  {
   "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
}
