{
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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
}