E04 シェルピンスキーのギャスケット
フラクタル曲線で有名なシェルピンスキーのギャスケットを描画します。
これまでのフラクタル曲線と同様です。
// 3点のリストから中点を追加したリストを返す
gas1(list):=(
p1=list_1;
p2=list_2;
p3=list_3;
p4=(p1+p2)/2;
p5=(p2+p3)/2;
p6=(p3+p1)/2;
[p1,p4,p6,p4,p2,p5,p6,p5,p3];
);
作図ツールで点A,B,Cをとって
pt=gas1([A,B,C]);
forall(pt,draw(#));
とすると,次のように表示されます。
// 3の倍数個のリストに対し,3点ずつ gas1()を適用した点を追加したリストを返す。
gas2(list):=(
ret=[];
repeat(length(list)/3,s,step->3,
ret=ret++gas1([list_s,list_(s+1),list_(s+2)]);
);
);
// 3の倍数個のリストに対し,先頭から3個ずつとってそれぞれ三角形を描く
gas3(list):=(
repeat(length(list)/3,s,step->3,
drawpoly([list_s,list_(s+1),list_(s+2)]);
);
);
// 3点のリストと回数を与えてシェルピンスキーのギャスケットを描く
gasket(list,n):=(
plist=list;
repeat(n,plist=gas2(plist));
gas3(plist);
);
1回 gasket([A,B,C],1); 5回 gasket([A,B,C],5);
シェルピンスキーのギャスケットも,タートルグラフィクスの置き換えシステムで描くことができます。