Sierpinskiの三角形(5)


2016年 10月 25日

前回、次の点の座標を求める関数NextPointを紹介したが、次の点の座標が式で示されていたので、何をやっているのか分かりにくかったと思う。

今回は、それを図で説明しよう。というか、図を見れば一目瞭然、とても簡単なことをしているだけだ。

sierpinskimidp.png最初に与えられた三角形の頂点をV1,V2,V3とする。今は、V1(0,0), V2(2,0), V3(1,1)となっている。
点Pが与えられたとき、次のP点を求めるのであるが,PとV1,V2,V3の中点をp1,p2,p3としたとき、p1,p2,p3のいずれか1つを同じ確率で次の点にすることを、前回は分かり難いプログラムで示した。わかり難くなっていたのは、参考にした本の式をそのまま利用したからである。

このように点列を次々に作っていき、点を順番に結ぶと、次の点は元の三角形のいずれかの頂点に向かって1/2だけ進んだ点になる。
これが前回示した図の意味である。丸と線を追いかけると良く分かるだろう。

sierpinskistep.png 原理がとても分かりやすくなったので、プログラムも当然分かりやすくなる。

num = input("How many points: ");
V = [ 0, 0; 2, 0; 1, 1 ];

P = [0,0];
X(1) = P(1)
Y(1) = P(2)
for i = 2:num
    Q = V(randi(3),:);
    P = (P + Q)/2;
    X(i) = P(1);
    Y(i) = P(2);
endfor

plot(X,Y,".b")

title( sprintf("Sierpinski triangle, num=%d",num) )

2次元図形の話を延々としてきたので飽きてきた。次回は3次元に拡張してみよう。