Sierpinskiの三角形(4)


2016年 10月 22日

最初に示したランダムに点を打つのを詳しく調べるために、丸を大きくし、順番に繋いでみた。

sierpinskistep.png

>> sierpinski2d_1
How many points: 10
(0.500000,0.500000)
(0.750000,0.750000)
(1.375000,0.375000)
(1.187500,0.687500)
(0.593750,0.343750)
(1.296875,0.171875)
(1.148438,0.585938)
(1.574219,0.292969)
(1.287109,0.646484)



これは、以下のプログラムを実行することで描かれる。

num = input("How many points: ");

x = 0;
y = 0;
X(1) = x;
Y(1) = y;
for i = 2:num
    [x,y] = NextPoint(x,y);
    X(i) = x;
    Y(i) = y;
    printf("(%f,%f)\n",x,y)
endfor

hold on
plot(X,Y,"ob")   #  丸を描く
plot(X,Y)          # 線で結ぶ
xlim([0,2])
ylim([0,1])
title( sprintf("Sierpinski triangle, num=%d",num) )
hold off

描画点数Nを入力し、N個の点の座標を計算し、x座標、y座標をそれぞれ配列X,Yに溜め込んでから最後にプロットしているだけである。
プロットは、丸を描くのと、線で結ぶのを別々にしている。そのため、hold on/hold off により重ね描きを実現している。

次の点の座標を求める関数NextPointは以下のようになっている。

function [p,q] = NextPoint(x,y)
    switch randi(3)
    case 1
        p = 0.5*x;
        q = 0.5*y;
    case 2
        p = 0.5*x + 0.5;
        q = 0.5*y + 0.5;
    case 3
        p = 0.5*x + 1;
        q = 0.5*y;
    endswitch
endfunction


この次の点の座標の計算の仕方(意図)の説明は今回は省略する。
その代わり、この乱数フラクタルと呼ばれる方法は、この本で見つけたのだが、もっと色々な切り口で説明を試みる。
つまり、この遣り方はエレガントでないし、汎用性にも乏しいことは次回に説明する。

Oreilly_pytho_mathintro (213x300).jpgPythonからはじめる数学入門
Amit Saha 著
黒川 利明 訳
オライリー・ジャパン
2016/5/20 発行
A5, 304ページ
ISBN978-487311-768-3

第6章 幾何図形とフラクタルを描画する (p181-182)
問題6-2 シェルピンスキーの三角形
 より計算方法を拝借した。