今回は前回の宿題の解答を題材に講義をしていきましょう。2次元座標空間における代表的な一次変換には次の4種類があり、これら以外の変換も全てこの4種類の組み合わせにより表せます。
歪曲だけは少し例外的で、組み合わせて一次変換の全パターンを網羅するために他の最初の3つに無理矢理付け足したようなものです[*1]。また、2次元→2次元以外の、2次元→n次元(n≠2、n≧0)の変換はここでは考えていません。[*2]
ここで思い出してほしいのですが、第一回で斜交座標の心であるベクトルの一次結合の話をしました。斜交座標変換つまり一次変換とは、図形的な意味としてはこの芯である定ベクトルを別のものにするという変換でした。ちなみに、この芯になるベクトルのことを基底もしくはベクトルであることを強調して基底ベクトルと呼びます。そして第二回では、その2つの定ベクトルの成分を並べて作った2次正方行列を掛けることで一次変換を表せることを解説しました。この考え方で4種類の一次変換を表す行列がどのようなものかをそれぞれ見ていきましょう。
なでしこの座標ではY軸が下向きであることに注意してください。図は、原点中心・時計回りにθ回転させる一次変換における基底ベクトルの移り変わりを示したものです。X軸の基底ベクトルはθの方向の単位ベクトル(cosθ,sinθ)へ、Y軸の基底ベクトルは(θ+π/2)の方向の単位ベクトル(cos(θ+π/2),sin(θ+π/2))=(-sinθ,cosθ)へ移っています。つまり、この一次変換を表す変換行列Aは、[[a11,a12],[a21,a22]]=[[cosθ,-sinθ],[sinθ,cosθ]]となるわけですね。
この行列は数Cの教科書にも載っているので、習って知っている人も多いでしょう。非常に使い勝手が良いので、是非覚えておいてください。[*3]
直線y=(tanθ)xについて折り返す変換(対称移動)も一次変換です。図は、2つの基底ベクトルを直線について折り返した様子を示したものです。X軸の基底ベクトルは2θの方向の単位ベクトル(cos2θ,sin2θ)へ、Y軸の基底ベクトルは2θ-π/2の方向の単位ベクトル(cos(2θ-π/2),sin(2θ-π/2))=(sin2θ,-cos2θ)へ移っています。つまり、この一次変換を表す変換行列Aは、[[a11,a12],[a21,a22]]=[[cos2θ,sin2θ],[sin2θ,-cos2θ]]です。
これも高校数学で出てきますが、コラムや豆知識として出てきますね。覚えている人はこの行列も暗記しているかもしれませんが、暗記していなくても、基底の変化ということを理解しておけば、同じような図を書いて基底の成分を並べればすぐに行列を導き出せます。
X軸方向をa倍に、Y軸方向をb倍に拡大(縮小)する変換も一次変換です。図は、それぞれの基底ベクトルをa倍、b倍した様子を示しています。X軸の基底ベクトルは同じ向きに長さaの(a,0)へ、Y軸の基底ベクトルは同じ向きに長さbの(0,b)へ移っています。変換行列Aは、[[a,0],[0,b]]です。
これは一次変換としても行列としてもとても単純で分かりやすいのですが、それだけに重要です。この形の行列は対角線上にだけ成分があるので対角行列と呼び、高校数学でも、行列の対角化やべき乗の問題などでよく見ますね。また、例えばX軸の単位をセンチメートル[cm]からメートル[m]に換えるなどの単位・尺度の変換(スケール変換)とも考えられます。
斜交座標変換が一次変換であることから明らかなように、直交座標を歪めるこの変換も一次変換です。図は、X軸の基底ベクトルをそのまま、Y軸の基底ベクトルだけX軸方向にaずらして(a,1)に移した状態を示しています。変換行列Aは、[[1,a],[0,1]]です。
左下の成分だけ0の行列を上三角行列と呼び、特にこの形の場合は対角成分が1なのでよく扱います。逆に、右上の成分が0の場合下三角行列と呼び、X軸をずらす変換を表す行列は下三角行列になります。対角行列ほど見ないかもしれませんが、やはりこれも高校数学で三角化やべき乗の問題で出てきます。
最初の3つの変換では、変換後の基底ベクトルが直交しており、座標系の直交性を保つ変換でしたが、4つ目に関しては文字通り座標系を歪めてしまいます。実用的な変換は最初の3つですが、この3つだけでは直交世界から抜け出せないため、歪んだ世界に飛び込むための変換が必要だったわけです。
さてそれでは実際に行列を使って上の4種類の一次変換を見ていこうと思いますが、その前準備として、前回扱った行列グループをいつでも取り込めるように、自分専用のライブラリとしてlibフォルダに保存する作業をしておきましょう。
# 取り込み用ライブラリ:「行列」「ベクトル」グループ ■行列 ・{配列}要素 ・データ ←行列設定 →行列取得 デフォルト ・行列設定(V)〜 要素=VをCSV取得 ・行列取得〜 それは要素 ・掛ける({行列}Mを)〜 Iとは整数。Jとは整数 ARRとは配列=M→要素 返り値とは配列 Iを0から(ARRの表行数-1)まで繰り返す Jを0から(要素の表列数-1)まで繰り返す ARR[I]を反復、返り値[I][J]に対象*要素[回数-1][J]を直接足す。 返り値を戻す ■ベクトル +行列 ・一次変換({行列}Mで)〜 要素=自身→掛ける(M)
これは前回のプログラム例で使用した行列とベクトルのグループの定義部分だけを取り出したものです。これを「matrix.nako」としてなでしこのライブラリフォルダ「nadesiko_lang\lib\」に保存すれば、いつでも取り込んで使えるようになります。nadesiko_langフォルダは通常、プログラムファイルズフォルダにインストールされているはずなので、フルパスだと「C:\Program Files\nadesiko_lang\lib\matrix.nako」になるでしょう。
これで準備終了です。あとは!『matrix.nako』を取り込む
と書くだけでいつでも行列グループを利用できるようになります。それでは具体的に見ていきませう。
宿題の円は「(X-5)2+(Y-4)2=9」(中心(5,4)半径3の円)でした。これをそのままなでしこの座標系で描画しても小さく表示されてしまうので、3の拡大変換を利用して適当な大きさにして他の行列を組み合わせると分かりやすくなります。
!『matrix.nako』を取り込む。#1 uとはベクトル。vとはベクトル θとは数値 Aとは行列。# 変換行列 Aは15度回転行列。 Bとは行列。# 拡大行列 Bは35倍拡大行列。 A=BをAに掛ける。#2 u="8{~}4" Aでuを一次変換 36回 θ=回数*10をラジアン変換 v="{3*COS(θ)+5}{~}{3*SIN(θ)+4}" Aでvを一次変換 uからvへ線分を引く u=v ●線分を引く({グループ}uから{グループ}vへ) 母艦のu→要素[0],u→要素[1]からv→要素[0],v→要素[1]へ線 #3 ●度回転行列({数値}DEG) θとは数値=DEGをラジアン変換 Cとは数値=COS(θ)。Sとは数値=SIN(θ) 「{C},{-S}{~}{S},{C}」を戻す #4 ●反転行列({数値}DEGの) θとは数値=DEG*2をラジアン変換 Cとは数値=COS(θ)。Sとは数値=SIN(θ) 「{C},{S}{~}{S},{-C}」を戻す #5 ●倍拡大行列({=?}A,B) もしAが空ならばA=B 「{A},0{~}0,{B}」を戻す
今回のプログラム自体はあっさりしていますが、解説で出てきた行列を組み合わせたり、第一回で使った座標軸も同時に表示させるなどして色々試してみるといいでしょう。
#1
#2
#3
#4
#5
ちなみに全ての一次変換は上の4つの組み合わせで表せますが、その表し方は一意には定まりません。全ての行列も同様に、基本行列というものの積で表すこともできますが、やはり一意ではありません。
宿題の円「(X-5)2+(Y-4)2=9」に対してある一次変換を施すと、円形ではなくなる(正円でも楕円でもなくなる)。そのような一次変換を探し、またその必要条件を考察せよ。
次回からは行列式・不動直線・固有ベクトル・固有値などに関する話を扱っていきたいと思います。ここまでの数学的内容を理解できているならば、漠然とでもその条件はイメージできるはずです。