2022年度計算機演習A・B

第11回レポート課題の解説

演習1

自分なりの家の図を描画する関数house()を定義し、その関数を呼び出してください。前回の演習1の内容に加えて、適宜塗りつぶしや色の変更を行うこと。

演習2

演習1の家に対して行列 $A$ と ベクトル $b$ によるアフィン変換を行った結果を描画する関数house_transform(A,b)を定義し、変換前の家と適当なアフィン変換を行った家を一つの図に描画してください。

演習3(オプション)

演習1の関数house()と演習2の関数house_transform(A,b)を利用して、

を一つの図に描画してください。

さらに、線形変換と平行移動の順番を変えることの意味について考察してください。

(考察)

縦ベクトルとして表される点 $x$ に対して、行列 $A$ による線形変換と縦ベクトル $b$ による平行移動を順に行うと

$$ Ax+b, $$

縦ベクトル $b$ による平行移動と行列 $A$ による線形変換を順に行うと

$$ A(x+b)=Ax+Ab $$

が得られる。多くの場合には $b\neq Ab$ であるから、上で描画した図のように線形変換と平行移動の順番を変えた際の結果は異なる。

例えば

$$ A= \begin{pmatrix} 1 & 0\\ 0 & -1 \end{pmatrix} ,\quad b= \begin{pmatrix} p\\ 0 \end{pmatrix} $$

として $x$ 軸に関する対称変換と $x$ 軸方向のみの平行移動を行う場合には、$b=Ab$ が成り立つため順番を変えても同じ結果になる。

(補足)

上の図で家と家が重なった部分の表示がおかしい(見えないはずの線が見えている)ことが気になった方がいると思いますが、これはmatplotlib.pyplotにおいてデフォルトで、塗りつぶしよりも線の描画の方が優先して表示されるよう設定されているためです。

表示順を変えたい場合には、個々のplot関数やfill関数の三つ目以降の引数としてzorder=数値を指定すればよいです。zorderの数値の大きいものが、手前に表示されます。デフォルトだと、plot関数はzorder=2fill関数はzorder=1になっているようです。

演習3の図を正常に表示するための方法としては、例えば次のように、関数house()house_transform(A,b)zorderを指定する引数を追加することが考えられます。