一次変換を複素数で

行列を使った一次変換の図を描くのに,複素数を使おうというのがこの節のテーマです。

例として,原点を通る直線に関する対称移動の図を描きましょう。

原点を通る直線に関する対称移動は,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();

< 戻る >