円に関する鏡映

円に関する鏡映(反転)は,現在の高校の教科書(数学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"]);

< 戻る >