行列と幾何変換 I

本日の授業では、行列を使って平面上の点のリストの扱いを勉強します。特に、行列を道具として点の幾何変換を行います。

点の幾何変換とは、点の実数倍、平行移動、回転などの変換です。

内容の概要

1. 平面上の点とグラフの表示

Pythonでは、matplotlib.pyplotというモジュールを導入することで点の表示ができます。

使い方:

matplotlib.pyplot.plot(...)
と書くのは長いので、matplotlib.pyplotを導入する行において
import matplotlib.pyplot as plt
とすると、asに続く文字列で省略表記を定義することができます。

例1:点のリストを描く

2つの点(1,0)と(3,1)を赤丸で表示するために、以下のコードを使用します。

import matplotlib.pyplot as plt
plt.plot([1,3], [0,1], 'ro')

x軸とy軸のアスペクト比

以下の命令によって、x軸とy軸のアスペクト比を1にすることができます。

plt.axes().set_aspect('equal')

行列を使って、点列を描画します。

点のリストとNumpyの行列

これからの計算では、$n$個の点からなる点列を$2\times n$の形の行列で表現します。そうすると、行列の各列は点列の点に対応します。 行列として処理する場合、Pythonライブラリにあるnumpyを使うと便利です。

numpyでは、「:」は「すべて」の意味をもっています。即ちここでは、「すべての行」または「すべての列」です。

例: p_list = np.array([[0, 1, 1], [0, 0, 1]])について、

列を取るために「すべての行」を使います。

行を取るために「すべての列」を使います。

例2:三角形を描く

3つの点(0,0), (1,0), (1,1)が作る三角形を描いてみます。x軸とy軸のアスペクト比を1とします。

閉じている多角形を描くためには、点のリストの最後にはじめの点を入れる必要があります。即ち、点(0,0), (1,0), (1,1), (0,0)というリストが必要です。

「家」の輪郭を描く

以下の三角の点列と四角の点列を使って、シンプルな「家」を描くことができます。 閉じている多角形を描くために、点のリストの最後にはじめの点を入れる必要があることに注意してください。

点の並び方と行列の転置

以下のコードでは、点の入力を楽にするために行列の転置を使っています。

roof_nodesの点のリストを用意するとき、一点ずつ書き並べる方が簡単なので、縦の行列を先に作成します。その後に、次のコードで行列の転置を行います。 roof_nodes = roof_nodes.T

例3:「家」を描く

演習1

上記の「家」の例とは異なる、自分なりの「家」を描いてください。

適当に窓やドアを追加しても良いです。その場合、家のそれぞれの構成部分のために点のリストを用意してください。

例えば、window_nodes、door_nodes。

2. 線形変換

2.1 拡大・縮小変換

点の$x$座標または$y$座標を実数倍することで、図形の拡大と縮小ができます。

$x$方向に$\alpha$倍にする変換

$$ x'=\alpha x,\ y' = y \iff \left(\begin{array}{c} x' \\ y' \end{array}\right) = A_x \left(\begin{array}{c} x \\ y \end{array}\right), \quad A_x=\left(\begin{array}{cc} \alpha & 0 \\ 0 & 1 \end{array}\right) $$

$y$方向に$\beta$倍にする変換

$$ x'=x,\ y' = \beta y \iff \left(\begin{array}{c} x' \\ y' \end{array}\right) = A_y \left(\begin{array}{c} x \\ y \end{array}\right), \quad A_y=\left(\begin{array}{cc} 1 & 0 \\ 0 & \beta \end{array}\right) $$

$x$方向に$\alpha$倍、$y$方向に$\beta$倍にする変換

$$ x'=\alpha x,\ y' = \beta y \iff \left(\begin{array}{c} x' \\ y' \end{array}\right) = A \left(\begin{array}{c} x \\ y \end{array}\right), \quad A=\left(\begin{array}{cc} \alpha & 0 \\ 0 & \beta \end{array}\right) = A_x A_y $$

例:

以下の例では、「家」を$x$方向に$2$倍、$y$方向に$1.5$倍に伸ばしています。変換前の家は赤、変換後の家は青で描かれています。

演習2

演習1で考えた「家」を、$x$方向と$y$方向に適当に伸ばして描いてください。

レポート課題

演習1で考えた「家」をベースにして、拡大・縮小変換によって2つのサイズの異なる「家」を描いてください。