コッホの雪片曲線
コッホ曲線をタートルグラフィクスで描きます。
タートルグラフィクスは、亀の視点で線を描きながらポインタ(亀の位置)を進めていきますが、すると亀の位置が常に原点Oとなってしまい、座標を拾うことができません。そこで、亀を動かしながらも、視点は最初の座標系のままであるようにします。
次のスクリプトを Initialization スロットに書きます。initialization スロットには、すでに、KETlib が書かれていますので、これとは別に作ります。Initializationのフォルダアイコンをクリックすると、initialization スロットに新しいページができます。
以下を打ち込むか、ここからカットアンドペーストでコピーします。
==============================================================
turtlereset():=(
Posx=0;
Posy=0;
Ang=0;
Tlist=[[0,0]]; // 亀は初め原点にいるものとする
);
forward(n):=(
nx=Posx+n*cos(Ang);
ny=Posy+n*sin(Ang);
draw((Posx,Posy),(nx,ny));
Posx=nx;
Posy=ny;
// 点のリストを書き出す
Tlist=append(Tlist,[Posx,Posy]);
);
left(θ):=( Ang=Ang+θ);
right(θ):=( Ang=Ang-θ);
// 亀を動かす
turtle(x,n,θ):=(
if(x=="F",forward(n));
if(x=="+",left(θ));
if(x=="-",right(θ));
);
// 文字列 s と進む距離n、角度を与えて描画する関数
tree(s,n,θ):=(
repeat(length(s),turtle(s_#,n,θ));
);
==============================================================
まず、関数をいくつか定義しています。
turtlereset() は、以下で使う変数の値の初期化です。
forward(n) は 亀がnだけ前に進みます。
left(θ)とright(θ)は、亀が左右にθだけ向きを変えます。
turtle(x,n,θ)は文字Xを解釈して亀を動かします。
tree(s,n,θ)は文字列sを順に解釈して亀を動かします。
次に、Draw スロットです。
すでにできている figures にそのまま書きます。
ファイル名 Fhead を koch などとしておきましょう。
===============================================================
Ketinit();
turtlereset();
s="F"; // 最初の状態。線分1つ
θ=pi/3; // 曲がる角度。
n=4; // 自己相似形のレベル
// 文字列を生成する
repeat(n,s=replace(s,"F","F+F--F+F"));
s="+"+s+"--"+s+"--"+s;
tree(s,6*(1/3)^n,θ);
// Tlist を分割して書き出す
nn=floor((length(Tlist)-1)/256)+1;
repeat(nn,tt,
Outlist=[];
sp=(tt-1)*256+1;
ep=min(tt*256,length(Tlist));
repeat(ep-sp+1,ss,
Outlist=append(Outlist,Tlist_(sp+ss-1));
);
nme="k"+text(tt);
Listplot(nme,Outlist);
);
Addax(0);
Windispg();
=============================================================
このなかで、KETpic用のデータを書き出すのは 下から4行目にある Listplot(nme,Outlist) です。ここでは、Cinderellaの幾何要素ではなく、計算した座標を使います。このような場合は、「名前」が必要になります。その名前がnmeです。
また、Listplot() では、あまり大きなリストを扱うことができません。扱えるリストの大きさはだいたい300くらいまでだと思っておくとよいです。そこで、タートルが描く線分の端点のリストTlist を分割します。ここでは256ごとに分割しています。
分割したら名前をつけて(nme="k"+text(tt); で k1 , k2 , ・・ と名前がついていきます)Listplotに渡しているのです。
つぎのようになります。
< 戻る >