第14回 行列と変換
まず、行列について、簡単に説明しておきます。数を長方形状ににいくつか並べたものを「行列」といいます。横の並びを「行」、縦の並びを「列」といいます。行列とベクトルには密接な関係があります。ベクトルはいくつかの数のペアでした。通常は横に並べて書きますが、縦に並べて書くこともできます。横に並べて書いたものを行ベクトル、縦に並べて書いたものを列ベクトルといいます。
平面上のベクトルは2つの実数のペアで表せます。成分表示です。そこで、平面上の点を扱うときには2行2列の行列を用います。(場合によっては3行2列も用います)
CindyScript や Mathematica では、ベクトルや行列は「リスト」として扱います。(CindyScriptとMathematicaでは括弧の使い方が異なりますが、考え方は同じなので、リストの考え方をCindyScriptでマスターすればMathematicaでも簡単に応用することができます)
「リスト」はその名のとおり、物(数でなくてもかまいません)を集めて、それを書き並べたものです。たとえば、買い物リスト[豚肉、キャベツ、みそ、とうがらし]といったものです。したがって、平面上のベクトルは[x,y]というリストということになります。また、行列は、行ベクトルが2つ(縦に)ならんだものと思えば、[[a,b],[c,d]]というリストになります。
注意点としては、行列を書くときには、それぞれの要素はスペースで区切って、コンマは書きませんが、リストではコンマで区切るということです。
行列の計算に関する最低限の知識として、ここでは2行2列の行列と列ベクトルの掛け算だけをとりあげておきます。まず2つのベクトルの「内積」というものを考えます。これは、1つ目の成分と2つ目の成分をそれぞれかけて足したものです。ベクトルの考え方ではすべて横に書きますが、行列の考え方では、掛けられる方のベクトルを縦に書きます。そして、左側のベクトルが2つ縦に並んで2行2列の行列になっていると思いましょう。
では、幾何を行列で扱う典型的な例として、「回転」をやりましょう。
半径rの円周上の点Pを角θだけ回転します。点Pの動径の角をαとすると次のような関係式が成り立ちます。(計算は加法定理を使って各自確かめましょう)
※訂正:上記 x=rcosθ , y=rsinθ は x=rcosα , y=rsinα の誤りです。
この結果を行列で表すと次のようになります。上の掛け算の式とよく見比べてください。
これで、回転を表す行列がわかりました。このような行列を「変換行列」といいます。リストで表すと [[cosθ,-sinθ],[sinθ,cosθ]] となります。
さて、CindyScriptでは、点Pの座標をP.xyで取得できます。取得した結果はベクトルです。また、リストとリストの掛け算を行列の掛け算のように行ないます。
たとえば
ですが、これを [[1,3],[-2,4]]*[2,3] で計算します。*は掛け算の印でしたね。
ではCinderella.2でやってみましょう。
まず、画面下のツールから「座標軸を描く」と「グリッドを描く」をクリックして方眼を出しておきましょう。
「点を加える」ツールボタンを選んで、点Aと点Bを適当なところに取ります。回転の具合がよくわかるように、線分を追加する」ツールボタンを選んで、原点とA,Bをそれぞれ線分で結びましょう。原点はたぶんCになっていると思いますので、編集メニューからインスペクタを開き、「要素を動かす」
モードにして点Cを
選択し、インスペクタの「要素の情報」(青いバックに白の i のアイコン)でOに名前を変えておきます。
スクリプトメニューからCindyScriptを選び、Drawスロットをクリックして、次のコードを書き込みます。(ここからカットアンドペーストも可)
------------------------------------------------------------------------------------------------------------
θ=pi/3;
m=[[cos(θ),-sin(θ)],[sin(θ),cos(θ)]];
B.xy=m*A.xy;
------------------------------------------------------------------------------------------------------------
角のθは日本語入力モードで「しーた」で変換すれば出るでしょう。piはCindyScriptが優先的に使う変数で、円周率πを表します。
歯車アイコンをクリックして実行し、点 A を動かしてみましょう。点Bが常に点Aを原点まわりにπ/3 (60°)回転した位置にあれば成功です。
θの値をいろいろ変えて動かしてみましょう。
今度は、図形をまとめて回転させます。
まず、図を消して書き直します。「すべてを選択する」ツールボタンをクリックし、続いて、「選択した要素を消去する」ツールボタンをクリックします。線分を追加する」ツールボタンを選んで、三角形ABCとDEFを適当な場所に描きます。CindyScriptで、三角形DEFが、三角形ABCを回転したものになるようにします。先ほどのスクリプトの3行目を書き換えます。
まとめて回転しますので、点をリストにします。そうして、対応する点を一つずつ変換していきます。ここで使う繰り返し処理はrepeat(n,処理)です。nは回数。ここでは、リストの要素の個数だけ繰り返しますので、リストの要素の個数を求める関数length()を使います。何回目の処理かをカウントするのは内部変数#ですので、この#を使って、リストの何番目の要素かを示すことにします。リストのn番目を取り出すには、アンダーバー_を使います。
----------------------------------------------------------------------------------------------------
θ=pi/3;
m=[[cos(θ),-sin(θ)],[sin(θ),cos(θ)]];
G1=[A,B,C];
G2=[D,E,F];
repeat(length(G1),(G2_#).xy=m*(G1_#).xy);
----------------------------------------------------------------------------------------------------
以上が 回転 でした。行列を変えるとその他の変換ができます。どのような行列を作れば、拡大・縮小(相似変換)や対称移動ができるでしょうか。平行移動は2行2列の行列ではできません。その理由も考えてみましょう。