行列と幾何変換 II

今回の授業では、平面上の点の回転と平行移動について検討します。回転や平行移動を行うために、アフィン変換を使用します。

復習:「家」を描く

以下の三角の点列と四角の点列を使って、シンプルな「家」を描くことができます。特に、各部分はplt.fill命令を使って塗りつぶししています。

補足:

plt.rcParams['figure.figsize'] = [10, 6]

plt.gca().set_aspect('equal')

2.1 拡大・縮小変換(復習)

対角行列を利用して、図形を拡大または縮小することができます。

$x$方向に$\alpha$倍、$y$方向に$\beta$倍にする変換は以下のようになります。

$$ \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 A=\left(\begin{array}{cc} \alpha & 0 \\ 0 & \beta \end{array}\right) $$

2.2 回転変換

点$(x,y)$を原点に関して反時計回りに$\alpha$度回転する変換を考えます。

回転後の点を$(x',y')$とすると、回転変換は行列を使って以下のように表現できます。

$$ \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 A=\left(\begin{array}{cc} \cos \alpha & -\sin \alpha \\ \sin \alpha & \cos \alpha \end{array}\right) $$
回転変換の行列を求める

$(x,y)$を極座標で考えます。 $$ (x,y) = ( r \cos\theta, r \sin\theta ) $$ この点を反時計回りに$\alpha$度回転した後、新しい座標$(x',y')$は以下のようになります。 $$ (x',y') = ( r \cos(\theta+\alpha), r \sin (\theta+\alpha) ) $$ 三角関数の計算を行うと、以下の結果が分かります。 $$ x'= r \cos\theta \cos\alpha - r \sin\theta \sin\alpha,\quad y'= r \cos\theta \sin\alpha + r \sin\theta \cos\alpha $$ 即ち、 $$ x'= x\cos\alpha - y\sin\alpha,\quad y'= x\sin\alpha + y\cos\alpha $$

例1:反時計周りに10度回転する

頂点(0,0), (1,0), (1,1)を持つ三角形を反時計周りに10度回転します。 回転前の三角形を青色、回転後の三角形を赤色で描きます。

2.3 平行移動とアフィン変換

グラフを指定されるベクトルの分だけ移動する場合、平行移動の変換が使用されます。例えば、グラフを$(x_0,y_0)$だけ移動するためには以下の変換を行います。

$$ \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) $$

線形変換(拡大や縮小,回転など)と平行移動を組み合わせた変換はアフィン変換と呼ばれています。 アフィン変換は一般に以下の形で表されます。

$$ \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) + \left(\begin{array}{c}x_0 \\ y_0 \end{array}\right) $$

ここで、$A$は線形変換の行列、$(x_0,y_0)$は平行移動のベクトルです。

注意: 線形変換はアフィン変換の特別な場合であり、アフィン変換は線形変換とは限りません!

例2:平行移動

例1で回転した三角形をさらに(2,1)だけ平行移動します。即ち、x方向に距離2, y方向に距離1だけ移動します。

例3:家の回転と平行移動

「家」を反時計回りに10度回転し、(6,2)だけ平行移動します。

ここでは、線形変換の行列$A$と平行移動のベクトル$b$を引数として持つhome_transformという関数を新しく定義しています。

演習1

前回のレポート課題で作成した「家」を以下の要求に従って変換してください。

ヒント:まず、家の描画関数 myhome(A,b) を定義してください。その後、上記の二つの変換に対して、それぞれの回転行列Aと平行移動ベクトルbを作成します。

演習2

ヒント:回転変換の行列を$A$、平行移動のベクトルを$(x_0,y_0)=(2, 3)$とすると、

[1]のアフィン変換は

$$ \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) + \left(\begin{array}{c}x_0 \\ y_0 \end{array}\right) $$

[2]のアフィン変換は

$$ \left(\begin{array}{c}x\\y\end{array}\right) \Rightarrow \left(\begin{array}{c}x'\\y'\end{array}\right) = A \left( \left(\begin{array}{c}x\\y\end{array}\right) + \left(\begin{array}{c}x_0 \\ y_0 \end{array}\right) \right) = A \left(\begin{array}{c}x\\y\end{array}\right) + A \left(\begin{array}{c}x_0 \\ y_0 \end{array}\right) $$

2.4 一般的な線形変換

拡大・縮小変換と回転変換以外にも、線形変換を自由に定義することができます。例えば、直線$y=2x$に関する反射変換も線形変換です。反射変換に対応する行列を求めてみてください。

例4:様々な変換行列

以下の行列$A$はどのような変換に対応しているか? 家を実際に変換してみて確認してください。

$$ A=\left(\begin{array}{cc}0&1\\ 1& 0\end{array}\right),\quad A=\left(\begin{array}{cc}1&0\\ 0& -1\end{array}\right),\quad A=\left(\begin{array}{cc}1&1\\ 0& 1\end{array}\right),\quad A=\left(\begin{array}{cc}1&1\\ 1& 1\end{array}\right) $$

各$A$を試して家を描画するとき、以下のことを考えてください。

レポート課題

以下の図に描かれた「坂の上の家」のように様々な形を持つ家を描いてください。