行列と幾何変換

今日の授業内容:

復習

「家」の描画は繰り返し使用されますので、関数でまとめて定義しましょう。

myhomeを使って、家を描いてみます。

演習 1

1. アフィン変換

アフィン変換は線形変換(拡大や縮小,回転など)と平行移動を組み合わせた変換です. 一般的なアフィン変換は以下の形にかけます。

$$ \left(\begin{array}{c}x\\y\end{array}\right) \Rightarrow \left(\begin{array}{c}x'\\y'\end{array}\right) = \left(\begin{array}{cc}a&b\\c&d\end{array}\right) \left(\begin{array}{c}x\\y\end{array}\right) + \left(\begin{array}{c}x_0 \\ y_0 \end{array}\right) $$

ここで、$(x_0,y_0)$は平行移動の方向を示しています。

行列Aとベクトルbで変形された家の描画関数 myhome_affine を作ります。

演習 2

各自で設計した家にアフィン変換をかける関数 myhome_affine(A,b)を作りなさい。

演習 3

注意:[1]と[2]をmyhome_affine()で描いてください。

ヒント:回転変換を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. 同次座標系

平面上の点$(x,y)$を以下のように拡張して、同次座標系で表現することができます。

$$ \left(\begin{array}{c}x\\y\end{array}\right) \Rightarrow \left(\begin{array}{c}x\\y\\1 \end{array}\right) $$

同次座標系から普通の座標系までの変換:

$$(x,y,c) \rightarrow (x/c,y/c)$$

同次座標系を使って、アフィン変換は行列とベクトルの積に書けます。 $$ \left(\begin{array}{c}x'\\y'\\1 \end{array}\right) =\left(\begin{array}{ccc}a&b&x_0\\ c&d & y_0 \\ 0 & 0 & 1 \end{array}\right) \left(\begin{array}{c}x\\y\\1 \end{array}\right) $$

回転変換は以下のようになります。 $$ A = \left(\begin{array}{ccc}\cos \alpha & -\sin \alpha & 0\\ \sin\alpha & \cos \alpha & 0 \\0 & 0 & 1 \end{array}\right) $$

$(x_0,y_0)$方向への平行移動は以下のようになります。

$$ A = \left(\begin{array}{ccc} 1 & 0 & x_0 \\ 0 & 1 & y_0\\ 0 & 0 & 1 \end{array}\right) $$

以下の例は「家」を反時計周り30ど回転して、(2,3)方向へ移動します。この場合、 $$ A = \left(\begin{array}{ccc}\cos \alpha & -\sin \alpha & 3\\ \sin\alpha & \cos \alpha & 2 \\0 & 0 & 1 \end{array}\right) $$

演習 4

3. 合成変換

同次座標系を使う場合、合成変換は行列の積の形に書けます。例えば、平面上の点に作用する2つの変換について、それぞれの変換に対応する行列を$A_1$と$A_2$とします。 この場合、2つの変換の合成に対応する行列$A$は次ぎのようになります。

例、家を$(2,3)$方向へ移動する変換$A_1$と反時計周り$\alpha$度を回転する変換$A_2$は以下のようにになります。

$$ A_1 = \left(\begin{array}{ccc} 1 & 0 & 2 \\ 0 & 1 & 3\\ 0 & 0 & 1 \end{array}\right), \quad A_2 = \left(\begin{array}{ccc}\cos \alpha & -\sin \alpha & 0\\ \sin\alpha & \cos \alpha & 0 \\0 & 0 & 1 \end{array}\right) $$

行列の積$B_1=A_1A_2$と$B_2=A_2A_1$の違いを確認してください。

以下の行列に対応する変形を考えてください。分からない場合、上記のセルのコードで試してください。

$$ A = \left(\begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0\\ 0 & 0 & 1/2 \end{array}\right) $$

演習 5

以下のリンクで書かれた「坂の上の家」のように様々な形を持っている家を描いてください。

家に関する変形や、家の数は自由です。

変形の例:家を(-10,5)に移動して、反時計周り10度で回転し、家の高さを1.5倍にすること。

演習 7 (チャレンジ)

ここで考えているのはカメラの撮影に関わる3次元空間のアフィン変換です。

三次元空間の点$(x,y,z)$を 平面$z=1$への投影変換を考えます。

三次元空間の点を同次座標系で考えます。3次元の点を$X=(x,y,z,1)$で書きます。$X$の投影した点$X'$は2次元同次座標系で$X'=(x,y,z)$と書けます。