2022年度計算機演習A・B

第10回:行列と幾何変換1

1. 線分を用いた図形の描画

matplotlib.pyplotライブラリのplot関数は、複数の点を結んで折れ線グラフを描画するものです。これまでの授業では、数列や関数のグラフを描画するために使用してきました。

今回の授業では、plot関数を使用することで線分を組み合わせてできるような図形を描画します。

1.1. 三角形の描画

三つの点 $(0,0),(1,0),(1,1)$ を頂点にもつような三角形を描画してみましょう。

このような三角形を描画するには、当然ながら $(0,0)$ と $(1,0)$、$(1,0)$ と $(1,1)$、$(1,1)$ と $(0,0)$ をそれぞれ線分で結ぶ必要があります。そのため、次のようなNumPyの $2\times 4$ の2次元配列(行列)triangle_nodesを用意します。

このとき、この行列の第0行triangle_nodes[0,:]が $x$ 座標のリスト、第1行triangle_nodes[1,:]が $y$ 座標のリストに対応するため、三角形の描画のコードは次のようになります。

1.2. 家の描画

続いて、三角形と四角形を組み合わせて家の図を描画してみましょう。

考える三角形の頂点を $(0,3),(-3,2),(3,2)$、四角形の頂点を $(-2,2),(-2,0),(2,0),(2,2)$ とし、それぞれの情報を変数roof_nodeswall_nodesに格納することにします。

演習1

自分なりの家の図を描画してください。屋根や壁の形を変えるほか、適当に窓やドアなどを追加すると良いです。

2. 線形変換

与えられた点や図形に対して、幾何変換(幾何学的な変換)を行うことを考えます。

変換前の点を $(x,y)$、変換後の点を $(x',y')$ とするとき、$2\times 2$ 行列 $A$ を用いて

$$ \begin{pmatrix} x'\\ y' \end{pmatrix} =A \begin{pmatrix} x\\ y \end{pmatrix} $$

と表されるのが線形変換(linear transformation)です。

重要なこととして、上で考えたような図形を特徴付ける複数の点からなる行列($2\times n$ 行列)に対して $A$ を左から掛ければ、全ての点に対する線形変換、すなわち図形に対する線形変換を行うことができます。

線形変換は様々に考えられますが、以下では重要なものを紹介します。

2.1. 拡大・縮小変換

拡大・縮小変換は、原点を中心に一定の倍率での拡大・縮小を行う線形変換です。

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

$$ \begin{pmatrix} x'\\ y' \end{pmatrix} = \begin{pmatrix} \alpha & 0\\ 0 & \beta \end{pmatrix} \begin{pmatrix} x\\ y \end{pmatrix} $$

と表されます。

例として、1.1の三角形に対して $x$ 軸方向に $2$ 倍、$y$ 軸方向に $1.5$ 倍する変換を行うと、次のようになります。

2.2. 回転変換

回転変換は、原点を中心に一定の角度での回転を行う線形変換です。

反時計回りに角度 $\theta$(単位はラジアン)だけ回転する変換は、

$$ \begin{pmatrix} x'\\ y' \end{pmatrix} = \begin{pmatrix} \cos\theta & -\sin\theta\\ \sin\theta & \cos\theta \end{pmatrix} \begin{pmatrix} x\\ y \end{pmatrix} $$

と表されます。

例として、1.1の三角形に対して反時計回りに $10$ 度だけ回転する変換を行うと、次のようになります。

2.3. 対称変換

対称変換は、原点を通るある直線に関して対称移動を行う線形変換です。

特に、$x$ 軸に関して対称移動する変換は

$$ \begin{pmatrix} x'\\ y' \end{pmatrix} = \begin{pmatrix} 1 & 0\\ 0 & -1 \end{pmatrix} \begin{pmatrix} x\\ y \end{pmatrix}, $$

$y$ 軸に関して対称移動する変換は

$$ \begin{pmatrix} x'\\ y' \end{pmatrix} = \begin{pmatrix} -1 & 0\\ 0 & 1 \end{pmatrix} \begin{pmatrix} x\\ y \end{pmatrix}, $$

直線 $y=x$ に関して対称移動する変換は

$$ \begin{pmatrix} x'\\ y' \end{pmatrix} = \begin{pmatrix} 0 & 1\\ 1 & 0 \end{pmatrix} \begin{pmatrix} x\\ y \end{pmatrix} $$

と表されます。

例として、1.1の三角形に対して $y$ 軸に関して対称移動する変換を行うと、次のようになります。

演習2

1.2の家(または演習1で考えた自分なりの家)に対して何かしらの拡大・縮小変換、回転変換、対称変換を一つずつ行い、変換前の家と合わせて四つの家を一つの図に描画してください。ただし、別々の色にすること。

演習3(オプション)

線形変換の一種であるせん断変換についてWikipediaなどで調べた上で、1.2の家(または演習1で考えた自分なりの家)に対して何かしらのせん断変換を行い、変換前の家と変換後の家を一つの図に描画してください。ただし、別々の色にすること。

第10回レポート課題

演習1~演習3に取り組んでください。