コッホの雪片曲線

コッホ曲線をタートルグラフィクスで描きます。

タートルグラフィクスは、亀の視点で線を描きながらポインタ(亀の位置)を進めていきますが、すると亀の位置が常に原点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に渡しているのです。

つぎのようになります。

< 戻る >