円に関する鏡映
円に関する鏡映(反転)は,現在の高校の教科書(数学III)でも紹介されています。(すべての教科書ではありません)
数学IIIの教科書では,複素数平面の節ですが,大学入試では数学IIまでの範囲で出題されています。
数学II までの範囲での表現は,
点O,P,Q (Oは原点)が同一線上にあり,OP・OQ=1 となるときのPとQの関係
また,数学IIIでは次の表現です。
点zと,点 1/conjugate(z) の関係( conjugate(z)はzの共役複素数)
Cinderellaには,モードメニューの「変換」ー「鏡映変換」で変換を定義すると,簡単に鏡映の像を描くことができます。
青の円が単位円です。緑の図形を描いておき,右上のボタンをクリックすると鏡像が描かれます。
円は円に,線分は弧に写ります。
さて,この図をKeTCindyで描くにはどうすればよいでしょう。
元の図は Circledata() , Listplot() で簡単に描けますが,鏡像は簡単ではありません。
円の方は,中心Eと,円周上の点Fの鏡像の位置を計算すれば(複素数を用いれば簡単)Circledata()で描けますが
線分の方は弧になりますので点A,B,C,Dの鏡像の位置だけでは解決しません。
そこで,それぞれのプロットデータの鏡像を求める関数を作ります。
ただし,Cirlcedata()のプロットデータはよいのですが,Listplot()のプロットデータは,端点しかないので,作り替えなければなりません。
まず,部品を作ります。点pの鏡像を返す関数です。複素数を使えば簡単です。
invpt(p):=(
regional(z);
z=complex(p);
gauss(1/conjugate(z));
);
次に,線分を分割したプロットデータを作る関数です。点p1,p2を端点として、その間を分割します。
1区間の長さのデフォルトを0.1として,オプションで変えられるようにします。
pddiv(p1,p2):=pddiv(p1,p2,0.1);
pddiv(p1,p2,res):=(
regional(dn,v,ret);
dn=dist(p1,p2)/res;
v=(p2-p1)/dn;
ret=apply(1..dn,p1+(#-1)*v);
ret=append(ret,p2);
);
次が本体です。プロットデータを引数として,各点間の距離が0.1(オプション res で変更可)より大きければ pddiv() を使って分割します。これにより,Listplot() でできたプロットデータは細かく分割され,その鏡像は弧になります。戻り値はプロットデータです。
inversion(pd):=inversion(pd,0.1);
inversion(pd,res):=(
regional(ln,p1,p2,tmp);
ln=length(pd);
tmp=[pd_1];
repeat(ln-1,s,
p1=pd_s;
p2=pd_(s+1);
if(dist(p1,p2)>0.1,
tmp=tmp++pddiv(p1,p2,res),
tmp=append(tmp,pd_(s+1));
);
);
apply(tmp,invpt(#));
);
これを使って,スクリプトを書くと次のようになります。
四角形のプロットデータ sgABCDA と,円のプロットデータ cdEF の鏡像を pd1 ,pd2 として,Addgraph() でまとめて描画します。
Addax(1);
Circledata("0",[[0,0],[1,0]],["do"]);
Listplot([A,B,C,D,A]);
Circledata([E,F]);
pd1=inversion(sgABCDA);
pd2=inversion(crEF);
Addgraph("1",["pd1","pd2"]);
< 戻る >