{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 行列と幾何変換 II\n",
    "\n",
    "今回の授業では、平面上の点の回転と平行移動について検討します。回転や平行移動を行うために、アフィン変換を使用します。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 復習：「家」を描く\n",
    "\n",
    "以下の三角の点列と四角の点列を使って、シンプルな「家」を描くことができます。特に、各部分はplt.fill命令を使って塗りつぶししています。\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",
    "``\n",
    "plt.rcParams['figure.figsize'] = [10, 6]\n",
    "``\n",
    "\n",
    "- アスペクト比を設定するために、以下の命令はおすすめです。\n",
    "\n",
    "``\n",
    "plt.gca().set_aspect('equal')\n",
    "``"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "#家を描画する関数を定義します。\n",
    "def home():\n",
    "    #グラフ全体のサイズを調整します。\n",
    "    plt.rcParams['figure.figsize'] = [10, 6]\n",
    "\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.fill(roof_nodes[0,:], roof_nodes[1,:], color=\"r\", alpha=0.4)#赤色で対応するエリアを塗りつぶします。\n",
    "    plt.plot(wall_nodes[0,:], wall_nodes[1,:], 'ro-')\n",
    "    plt.fill(wall_nodes[0,:], wall_nodes[1,:], color=(0.2,0.2,0.9), alpha=0.4)#(r,g,b)の組を使って色を指定することもできます。\n",
    "    plt.grid()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "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": [
    "#家の描画関数を呼び出します。\n",
    "home()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.1 拡大・縮小変換（復習）\n",
    "\n",
    "対角行列を利用して、図形を拡大または縮小することができます。\n",
    "\n",
    "$x$方向に$\\alpha$倍、$y$方向に$\\beta$倍にする変換は以下のようになります。\n",
    "\n",
    "$$\n",
    "\\left(\\begin{array}{c} x \\\\ y \\end{array}\\right) \\Rightarrow\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)\n",
    "$$\n",
    "\n",
    "\n",
    "## 2.2 回転変換\n",
    "\n",
    "点$(x,y)$を原点に関して反時計回りに$\\alpha$度回転する変換を考えます。\n",
    "\n",
    "\n",
    "回転後の点を$(x',y')$とすると、回転変換は行列を使って以下のように表現できます。\n",
    "\n",
    "$$\n",
    "\\left(\\begin{array}{c}x\\\\y\\end{array}\\right) \\Rightarrow \\left(\\begin{array}{c}x'\\\\y'\\end{array}\\right) = A  \\left(\\begin{array}{c}x\\\\y\\end{array}\\right), \\quad\n",
    "A=\\left(\\begin{array}{cc} \\cos \\alpha & -\\sin \\alpha \\\\ \\sin \\alpha & \\cos \\alpha \\end{array}\\right)\n",
    "$$\n",
    "\n",
    "<blockquote>\n",
    "    \n",
    "<b>回転変換の行列を求める</b> <br><br>\n",
    "\n",
    "\n",
    "$(x,y)$を極座標で考えます。\n",
    "\n",
    "$$\n",
    "(x,y) = ( r \\cos\\theta, r \\sin\\theta ) \n",
    "$$\n",
    "\n",
    "この点を反時計回りに$\\alpha$度回転した後、新しい座標$(x',y')$は以下のようになります。\n",
    "\n",
    "$$\n",
    "(x',y') = ( r \\cos(\\theta+\\alpha), r \\sin (\\theta+\\alpha)  )\n",
    "$$\n",
    "\n",
    "三角関数の計算を行うと、以下の結果が分かります。\n",
    "\n",
    "$$\n",
    "x'= r \\cos\\theta \\cos\\alpha - r \\sin\\theta \\sin\\alpha,\\quad\n",
    "y'= r \\cos\\theta \\sin\\alpha + r \\sin\\theta \\cos\\alpha\n",
    "$$\n",
    "\n",
    "即ち、\n",
    "$$\n",
    "x'= x\\cos\\alpha - y\\sin\\alpha,\\quad\n",
    "y'= x\\sin\\alpha + y\\cos\\alpha\n",
    "$$    \n",
    "</blockquote>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 例1：反時計周りに10度回転する\n",
    "\n",
    "頂点(0,0), (1,0), (1,1)を持つ三角形を反時計周りに10度回転します。\n",
    "回転前の三角形を青色、回転後の三角形を赤色で描きます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "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 math\n",
    "p_list = np.array([[0,0],[1,0],[1,1]]).T\n",
    "\n",
    "plt.axes().set_aspect('equal')\n",
    "         \n",
    "plt.fill(p_list[0,:], p_list[1,:], 'blue', alpha=0.8)\n",
    "\n",
    "#回転用の行列を作成します。\n",
    "alpha = 10/180*math.pi\n",
    "A = np.array([[math.cos(alpha), -math.sin(alpha)],\n",
    "              [math.sin(alpha), math.cos(alpha)]])\n",
    "\n",
    "new_p_list = A@p_list #回転行列と点のリストの積\n",
    "plt.fill(new_p_list[0,:], new_p_list[1,:], 'red', alpha=0.8)\n",
    "\n",
    "plt.grid()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.3 平行移動とアフィン変換\n",
    "\n",
    "グラフを指定されるベクトルの分だけ移動する場合、平行移動の変換が使用されます。例えば、グラフを$(x_0,y_0)$だけ移動するためには以下の変換を行います。\n",
    "\n",
    "$$\n",
    "\\left(\\begin{array}{c}x\\\\y\\end{array}\\right) \\Rightarrow \\left(\\begin{array}{c}x'\\\\y'\\end{array}\\right) = \\left(\\begin{array}{c}x\\\\y\\end{array}\\right) + \\left(\\begin{array}{c}x_0 \\\\ y_0 \\end{array}\\right)\n",
    "$$\n",
    "\n",
    "線形変換（拡大や縮小，回転など）と平行移動を組み合わせた変換はアフィン変換と呼ばれています。\n",
    "アフィン変換は一般に以下の形で表されます。\n",
    "\n",
    "$$\n",
    "\\left(\\begin{array}{c}x\\\\y\\end{array}\\right) \\Rightarrow \\left(\\begin{array}{c}x'\\\\y'\\end{array}\\right) = \n",
    "A \\left(\\begin{array}{c}x\\\\y\\end{array}\\right) + \\left(\\begin{array}{c}x_0 \\\\ y_0 \\end{array}\\right)\n",
    "$$\n",
    "\n",
    "ここで、$A$は線形変換の行列、$(x_0,y_0)$は平行移動のベクトルです。\n",
    "\n",
    "**注意：** 線形変換はアフィン変換の特別な場合であり、アフィン変換は線形変換とは限りません！\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 例2：平行移動\n",
    "\n",
    "例1で回転した三角形をさらに(2,1)だけ平行移動します。即ち、x方向に距離2, y方向に距離1だけ移動します。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "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 math\n",
    "\n",
    "plt.gca().set_aspect('equal')\n",
    "\n",
    "p_list = np.array([[0,0],[1,0],[1,1]]).T\n",
    "\n",
    "#変換前の三角形を青色で描きます。\n",
    "plt.fill(p_list[0,:], p_list[1,:], 'blue', alpha=0.8)\n",
    "\n",
    "#回転用の行列を作成します。\n",
    "alpha = 10/180*math.pi\n",
    "A = np.array([[math.cos(alpha), -math.sin(alpha)],\n",
    "              [math.sin(alpha), math.cos(alpha)]])\n",
    "\n",
    "#平行移動のベクトルを作成します。\n",
    "b = np.array([[2,1]]).T\n",
    "\n",
    "#回転＋平行移動\n",
    "new_p_list = A@p_list + b \n",
    "\n",
    "#変換後の三角形を赤色で描きます。\n",
    "plt.fill(new_p_list[0,:], new_p_list[1,:], 'red', alpha=0.8)\n",
    "\n",
    "plt.grid()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 例3：家の回転と平行移動\n",
    "\n",
    "「家」を反時計回りに10度回転し、(6,2)だけ平行移動します。\n",
    "\n",
    "ここでは、線形変換の行列$A$と平行移動のベクトル$b$を引数として持つhome_transformという関数を新しく定義しています。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "#家を変換して描画する関数を定義します。\n",
    "def home_transform(A,b):\n",
    "    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",
    "    roof_nodes = A@roof_nodes + b\n",
    "    wall_nodes = A@wall_nodes + b\n",
    "\n",
    "\n",
    "    #変換後の家の描画\n",
    "    plt.rcParams['figure.figsize'] = [10, 6]\n",
    "    plt.gca().set_aspect('equal')\n",
    "\n",
    "    plt.plot(roof_nodes[0,:], roof_nodes[1,:], 'ro-')\n",
    "    plt.fill(roof_nodes[0,:], roof_nodes[1,:], color=\"r\", alpha=0.4)\n",
    "    plt.plot(wall_nodes[0,:], wall_nodes[1,:], 'ro-')\n",
    "    plt.fill(wall_nodes[0,:], wall_nodes[1,:], color=(0.2,0.2,0.9), alpha=0.4)\n",
    "    plt.grid()\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "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": [
    "#回転用の行列を作成します。\n",
    "alpha = 10/180*math.pi\n",
    "A = np.array([[math.cos(alpha), -math.sin(alpha)],\n",
    "              [math.sin(alpha), math.cos(alpha)]])\n",
    "\n",
    "#平行移動のベクトルを作成します。\n",
    "b = np.array([[6,2]]).T\n",
    "\n",
    "#変更前\n",
    "home()\n",
    "#変更後\n",
    "#plt.figure() #この行を実行すると、その後の描画は新しいグラフになります。\n",
    "home_transform(A,b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習1\n",
    "\n",
    "前回のレポート課題で作成した「家」を以下の要求に従って変換してください。\n",
    "\n",
    "- 反時計回りに10度回転して、ベクトル(-5,0)だけ平行移動します。\n",
    "- 時計回りに10度回転して、ベクトル(5,1)だけ平行移動します。\n",
    "\n",
    "**ヒント**：まず、家の描画関数 myhome(A,b) を定義してください。その後、上記の二つの変換に対して、それぞれの回転行列Aと平行移動ベクトルbを作成します。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "#ここにコードを書いてください。\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "#家を変換して描画する関数を定義します。\n",
    "def myhome(A,b):\n",
    "    pass\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習2\n",
    "\n",
    "- [1] 家を反時計回りに15度回転した後、ベクトル$(2,3)$だけ平行移動して描いてください。\n",
    "- [2] 家をベクトル$(2,3)$だけ平行移動した後、反時計回りに15度回転して描いてください。\n",
    "- [3] 回転と平行移動の順番が変わると、得られた図は同じでしょうか？\n",
    "\n",
    "**ヒント**：回転変換の行列を$A$、平行移動のベクトルを$(x_0,y_0)=(2, 3)$とすると、\n",
    "\n",
    "[1]のアフィン変換は\n",
    "\n",
    "$$\n",
    "\\left(\\begin{array}{c}x\\\\y\\end{array}\\right) \\Rightarrow \\left(\\begin{array}{c}x'\\\\y'\\end{array}\\right) = \n",
    "A\n",
    "\\left(\\begin{array}{c}x\\\\y\\end{array}\\right) + \\left(\\begin{array}{c}x_0 \\\\ y_0 \\end{array}\\right)\n",
    "$$\n",
    "\n",
    "\n",
    "[2]のアフィン変換は\n",
    "\n",
    "$$\n",
    "\\left(\\begin{array}{c}x\\\\y\\end{array}\\right) \\Rightarrow \\left(\\begin{array}{c}x'\\\\y'\\end{array}\\right) = \n",
    "A\n",
    "\\left( \n",
    "\\left(\\begin{array}{c}x\\\\y\\end{array}\\right) + \\left(\\begin{array}{c}x_0 \\\\ y_0 \\end{array}\\right)\n",
    "\\right)\n",
    "=\n",
    "A\n",
    "\\left(\\begin{array}{c}x\\\\y\\end{array}\\right) + \n",
    "A\n",
    "\\left(\\begin{array}{c}x_0 \\\\ y_0 \\end{array}\\right)\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "#演習2のコード\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.4 一般的な線形変換\n",
    "\n",
    "拡大・縮小変換と回転変換以外にも、線形変換を自由に定義することができます。例えば、直線$y=2x$に関する反射変換も線形変換です。反射変換に対応する行列を求めてみてください。\n",
    "\n",
    "\n",
    "### 例4：様々な変換行列\n",
    "\n",
    "以下の行列$A$はどのような変換に対応しているか？　家を実際に変換してみて確認してください。\n",
    "\n",
    "$$\n",
    "A=\\left(\\begin{array}{cc}0&1\\\\ 1& 0\\end{array}\\right),\\quad\n",
    "A=\\left(\\begin{array}{cc}1&0\\\\ 0& -1\\end{array}\\right),\\quad\n",
    "A=\\left(\\begin{array}{cc}1&1\\\\ 0& 1\\end{array}\\right),\\quad\n",
    "A=\\left(\\begin{array}{cc}1&1\\\\ 1& 1\\end{array}\\right)\n",
    "$$\n",
    "\n",
    "各$A$を試して家を描画するとき、以下のことを考えてください。\n",
    "\n",
    "- 変換前後の図形の面積の変化とAの行列式の関係\n",
    "- 行列式が0、または負の場合、それに対応する幾何変換の特徴\n",
    "- 変換前に平行である線分は変換後にまた平行になるか？\n",
    "- 図形中の点と点の間の距離は変換前後に変わるか？\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "b = np.array([[0,0]]).T\n",
    "\n",
    "A = np.array([[0,1],[1,0]])\n",
    "#A = np.array([[1,0],[0,-1]])\n",
    "#A = np.array([[1,1],[0,1]])\n",
    "#A = np.array([[1,1],[1,1]])\n",
    "home_transform(A,b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### レポート課題\n",
    "\n",
    "以下の図に描かれた「坂の上の家」のように様々な形を持つ家を描いてください。\n",
    "\n",
    "<img src=\"http://www.ces-alpha.org/download/gs/?label=F11&conf_id=CM2018&verify=c69f6\" width=400px>\n",
    "\n",
    "- 家を少なくとも二つ描いてください。\n",
    "- 家に関する変換は自由です。\n",
    "- 変形の例：家を(-10,5)だけ平行移動して、反時計回りに10度回転し、家の高さを1.5倍にする。"
   ]
  },
  {
   "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
}
