一次変換を複素数で
行列を使った一次変換の図を描くのに,複素数を使おうというのがこの節のテーマです。
例として,原点を通る直線に関する対称移動の図を描きましょう。
原点を通る直線に関する対称移動は,x軸に関する対称移動と,原点を中心とした回転の合成変換である,という図です。
この図を描くのに,行列ではなく複素数を用いようというのです。
図を描くだけなら,Reflectdata()を使えばよいので簡単にできます。
ここでは,複素数を使う計算例として紹介します。
まず,x軸に関する対称移動は,共役複素数をとるだけです。
回転は (cosθ+isinθ)をかけるだけですね。
そこで,作図に必要な幾何要素を先にとります。
・原点を通る直線AB
・対象となる点Cとx軸に関する対称移動をした点D,直線に関する対称移動をした点E
ただし,D,Eの位置はあとで計算するので,今は単に点をとるだけです。
CD,CEは線分で結ぶので,点を加えるツールではなく線分を加えるツールで描きましょう。
・CEとABの交点F
・x軸を表す直線AG
・CDとAGの交点H
・一次変換の記号 h,g,f を書く場所として点K,L,M。位置はあとで調整します。
以上は,作図順は問いません。これらの点がとれればよいということです。
これらの点のうち,インタラクティブに動かすのは点BとCなので,インスペクタで色を変えておくとよいでしょう。
次に,点D,Eの位置を決めます。
Cを表す複素数をz1とすると,Dを表す複素数はz1の共役複素数,Eはz1に cos2θ+isin2θ をかけたものです。
z1=complex(C);
th=arctan2(B); // x軸と直線のなす角
th2=arctan2(C); // x軸とOCのなす角
z2=conjugate(z1);
D.xy=gauss(z2);
E.xy=gauss(z2*(cos(2*th)+i*sin(2*th)));
点Cを動かしてみてD,Eの位置が正しく決まることを確かめましょう。
この図を見ながら,KeTCindyで作図のコマンドを書いていきます。
なお,これについては,「KeTCindyによる図入り教材の作成」のページhttps://www65.atwiki.jp/ketcindy/pages/105.html を参考にしました。
このページと違うのは,必要な幾何要素を先に作図してしまうという点です。
実行後,細かい位置調整をしていきます。
Lineplot([A,B]);
Listplot([A,C]);
Listplot([A,D]);
Listplot([A,E]);
Arrowdata([C,E],[2,"da"]);
Ptsize(4);
Drawpoint([C,D,E]);
Paramark([C,F,A],[0.5]);
Letter([C,"e2","P",D,"s2","P$`$",E,"nw","P$``$"]);
Expr([B,"n2","\ell",K,"e","f",L,"w","g",M,"w","h"]);
//角のマークは後で青く描きたいので,"nodisp" としておき,\theta だけ書く.
Anglemark("1",[H,A,F],["E=1.2,\theta",3,"nodisp"]);
// 角の印 白抜きと黒 画面には出ない
Ptsize(4);
Drwpt([cos((th+th2)/2),sin((th+th2)/2)],[0]);
Drwpt([cos((3*th-th2)/2),sin((3*th-th2)/2)],[0]);
Ptsize(2);
Drwpt([cos(th2/2),sin(th2/2)]);
Drwpt([cos(-th2/2),sin(-th2/2)]);
// このあと青で描く
Setcolor([0,0,1]);
Arrowdata([C,D],[2]);
Paramark([A,H,C],[0.5]);
Bowdata([D,E],[3]);
Arrowhead(E,[-1,0.1],[2]);
// "nodisp" としておいた角のマークをここで表示する.
AddGraph("1",["ag1"],[]);
// 座標軸のために色を戻す
Setcolor([0,0,0]);
Windispg();
< 戻る >