{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 行列と幾何変換\n", "\n", "平面上の点$(x,y)$を新しい点$(x',y')$に変換すること、所謂幾何変換を考えます。\n", "\n", "内容の概要:\n", "\n", "- 平面上の点とグラフの表示\n", "- 線形変換\n", "- アフィン変換\n", "- 同次座標系\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1. 平面上の点とグラフの表示\n", "\n", "Octaveでは、plotを使って、点の表示ができます。\n", "\n", "使い方:\n", "\n", "- plot( 点列のX座標のリスト、点列のY座標のリスト、プロットのフォマット)\n", "\n", "#### 例1: \n", "(1,0)と (2,3)2つの点を「+」のマックで表示するために、下の命令を使用する。\n", "\n", "- plot ([1,2], [0,3], '+')\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "Gnuplot\n", "Produced by GNUPLOT 5.0 patchlevel 3 \n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\t\t\n", "\t\n", "\n", "\n", "\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\t\t\n", "\t\t0.5\n", "\t\n", "\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\t\t\n", "\t\t1.5\n", "\t\n", "\n", "\n", "\t\t\n", "\t\t2\n", "\t\n", "\n", "\n", "\t\t\n", "\t\t2.5\n", "\t\n", "\n", "\n", "\t\t\n", "\t\t3\n", "\t\n", "\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\t\t\n", "\t\t1.2\n", "\t\n", "\n", "\n", "\t\t\n", "\t\t1.4\n", "\t\n", "\n", "\n", "\t\t\n", "\t\t1.6\n", "\t\n", "\n", "\n", "\t\t\n", "\t\t1.8\n", "\t\n", "\n", "\n", "\t\t\n", "\t\t2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\tgnuplot_plot_1a\n", "\n", "\t \n", "\t\n", "\t\n", "\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%plot -f svg\n", "% 2つの点の表示\n", "plot ([1,2], [0,3], 'r+')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "配列を使って、点列を描画します。\n", "\n", "Octaveの中では、「:」は「すべて」の意味をもっています。即ち、「すべての行」、または、「すべての列」です。\n", "\n", "例: p_list =[ 0, 1, 1 ; 0, 0, 1] について、\n", "\n", "- p_list(:,1) はp_listのすべての行、第1列を示しています。即ち、点列の1番目の点。\n", "- p_list(1,:) はp_listの第1行、すべての列を示しています。即ち、すべての点のx座標。\n", "\n", "\n", "### 注意\n", "\n", "これからの計算では、長さがnである点列を$2\\times n$の形の行列で表現します。そうすると、行列の各列は点列の点に対応します。\n", "\n", "#### 例2:\n", "三点(0,0), (1,0), (1,1)を描いてみます。\n", "\n", "ここで、「axis(\"equal\")」によって、x軸とy軸のアスペクト比を1にすることができます。" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "p_list =\n", "\n", " 0 1 1\n", " 0 0 1\n", "\n" ] }, { "data": { "image/svg+xml": [ "\n", "\n", "Gnuplot\n", "Produced by GNUPLOT 5.0 patchlevel 3 \n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\t\t\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.4\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.6\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.8\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.4\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.6\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.8\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\tgnuplot_plot_1a\n", "\n", "\t\t \n", "\t\n", "\t\n", "\t\n", "\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p_list =[ 0, 1, 1 ; \n", " 0, 0, 1]\n", "\n", "plot( p_list(1,:), p_list(2,:), 'r+-')\n", "grid on\n", "axis(\"equal\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 演習 1:「家」の輪郭を書いてください。\n", "\n", "ヒント:以下の三角の点列と四角の点列を使って、シンプルな「家」を描けます。\n", "\n", "- triangle_nodes: (-3,2), (3,2), (0,3) \n", "- square_nodes: (-2,2), (-2,0), (2,0), (2,2)\n" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "Gnuplot\n", "Produced by GNUPLOT 5.0 patchlevel 3 \n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\t\t\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-0.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t2.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t3\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t3.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-3\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t3\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\tgnuplot_plot_1a\n", "\n", "\t\t \n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "\t\n", "\tgnuplot_plot_2a\n", "\n", "\t\t \n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%ここで点の座標を書いてください。\n", "triangle_nodes = [??];\n", "square_nodes = [??];\n", "\n", "hold on\n", "plot(triangle_nodes(1,:), triangle_nodes(2,:),'-ro')\n", "plot(square_nodes(1,:), square_nodes(2,:),'-ro')\n", "grid on\n", "axis(\"equal\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "家の描画に使用される2つの点列を一つの点列にしてください。適当に、窓、ドアを追加しても良いです。\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "Gnuplot\n", "Produced by GNUPLOT 5.0 patchlevel 3 \n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\t\t\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-0.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t2.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t3\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t3.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-3\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t3\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\tgnuplot_plot_1a\n", "\n", "\t\t \n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%ここでコードを書いてください。\n", "p_list = [-3,2;-2,2; -2,0; 2,0; 2,2; 3,2; 0,3; -3,2]';\n", "\n", "hold on\n", "plot(p_list(1,:),p_list(2,:),'-bd')\n", "grid on\n", "axis(\"equal\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. 線形変換\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.1 拡大・縮小変換" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "点の$x$座標または$y$座標を$t$倍にすることで、図形の拡大と縮小ができます。\n", "\n", "$x$方向で$t$倍にする変換\n", "\n", "\n", "$$\n", "x'=tx,y' = y \\Leftrightarrow \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} t & 0 \\\\ 0 & 1 \\end{array}\\right) \n", "$$\n", "\n", "$y$方向で$t$倍にする変換\n", "\n", "$$\n", "x'=x,y' = ty \\Leftrightarrow\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} 1 & 0 \\\\ 0 & t \\end{array}\\right) \n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 演習2\n", "\n", "演習1で考えた「家」を$x$方向$2$倍、$y$方向$1.5$倍に伸ばして、描いてください。" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "Gnuplot\n", "Produced by GNUPLOT 5.0 patchlevel 3 \n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\t\t\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t3\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t4\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t6\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t7\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-6\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-4\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t4\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t6\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\tgnuplot_plot_1a\n", "\n", "\t\n", "\t\n", "\tgnuplot_plot_2a\n", "\n", "\t\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%ここで演習のコードを書いてください。\n", "\n", "p_list = [-3,2;-2,2; -2,0; 2,0; 2,2; 3,2; 0,3; -3,2]';\n", "\n", "hold on\n", "plot(p_list(1,:),p_list(2,:),'-r')\n", "\n", "A=[2, 0; 0, 1.5];\n", "\n", "new_p_list = A*p_list;\n", "plot(new_p_list(1,:), new_p_list(2,:),'-b')\n", "\n", "grid on\n", "axis(\"equal\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Octave", "language": "octave", "name": "octave" }, "language_info": { "file_extension": ".m", "help_links": [ { "text": "GNU Octave", "url": "https://www.gnu.org/software/octave/support.html" }, { "text": "Octave Kernel", "url": "https://github.com/Calysto/octave_kernel" }, { "text": "MetaKernel Magics", "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" } ], "mimetype": "text/x-octave", "name": "octave", "version": "4.0.0" } }, "nbformat": 4, "nbformat_minor": 1 }