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);


シェルピンスキーのギャスケットも,タートルグラフィクスの置き換えシステムで描くことができます。