E02 ドラゴン曲線
ドラゴン曲線を作図します。方法はいろいろあるのですが,まずは「GeoGebra日本」の「GeoGebra実例」「E02 ドラゴン曲線」にならってやってみましょう。
線分を作図する関数を定義
偶数個の点のリストの先頭から2点ずつを結ぶ線分を作図する関数 segs2() を定義します。引数が奇数個のリストだったときの処理は行いません。偶数である前提です。
segs2(list):=(
n=length(list)/2;
repeat(n,s,step->2,
draw([list_s,list_(s+1)]);
);
);
ドラゴン曲線の生成アルゴリズム (dragon1()) の作成
2点のリストを与えると、中間点を追加したリストを返す関数を作成します。複素数で回転します。
dragon1(list):=(
z1=complex(list_1);
z2=complex(list_2);
z3=z1+(z2-z1)/sqrt(2)*(cos(pi/4)+i*sin(pi/4));
p=gauss(z3);
[list_1,p,list_2,p];
);
2点A,Bを作図して dragon1([A,B]) とした戻り値を使って点を表示すると次のようになります。
ドラゴン曲線の点を生成する関数 (dragon2()) の作成
複数の点のリストを与えると、2点ずつ dragon1() を適用した点を追加したリストを返します。
dragon2(list):=(
ret=[];
n=length(list)/2;
repeat(n,s,step->2,
ret=ret++dragon1([list_s,list_(s+1)]);
);
);
ドラゴン曲線描画関数 (dragoncurve()) の作成
2点と繰り返し回数を与えるとドラゴン曲線を描画するコマンドを作成します。
dragoncurve(list,n):=(
plist=list;
repeat(n,plist=dragon2(plist));
segs2(plist);
);
nの値によって,次のようになります。
n=2 のとき dragoncurve([A,B],2);
n=10 のとき dragoncurve([A,B],10);
ドラゴン曲線は,タートルグラフィクスを用いて,L-systemの置き換えシステムで描くこともできます。