#はじめに
フラクタルのひとつにシェルピンスキーのギャスケットというものがあります。
フラクタルの特徴に”自己相似形”があります。まさにシェルピンスキーのギャスケットはその特徴を持っています。拡大しても同じ三角形(逆三角形?)が見えてきます。
そしてもう一つの特徴は三角形の中身がスカスカなことです。
三角形を大きくしていくと面積が増えるのに密度が0になるということ。
これ以上の説明は専門書に任せましょう。
さっそく、この図を描くシンプルなプログラムを紹介します。
ただし、図を描くのはgnuplotを使います。pythonは座標出力のみです。
また、実際には頂点位置の三角形は埋めなければなりませんが、今回はすべて線で描きます。
#python3のコード
# -*- coding: utf-8 -*-
#sierpinskigasket.py
maxlevel = 7
def gasket(x10, y10, x20, y20, x30, y30, level):
if level == maxlevel:
print(x10, y10)
print(x20, y20, "\n")
print(x20, y20)
print(x30, y30, "\n")
print(x30, y30)
print(x10, y10, "\n")
return
else:
x11, y11 = (x20+x30)/2.0, (y20+y30)/2.0
x21, y21 = (x30+x10)/2.0, (y30+y10)/2.0
x31, y31 = (x10+x20)/2.0, (y10+y20)/2.0
gasket(x10,y10, x31, y31, x21, y21, level + 1)
gasket(x31,y31, x20, y20, x11, y11, level + 1)
gasket(x21,y21, x11, y11, x30, y30, level + 1)
x10, y10, x20, y20, x30, y30, level = 0.0, 0.0, 1.0, 0.0, 0.5, 1.0, 0
gasket(x10, y10, x20, y20, x30, y30, level)
とてもシンプルですね。
まず一番大きな三角形の頂点の座標(x10, y10), (x20, y20), (x30, y30)に初期値を入れます。
そして、gasketを呼びます。
gasketはgasket内で再帰的に呼ばれます。
if文の中を見てみましょう。
6つのprint文があります。これは3角形の3つの辺を出力するためのものです。
1つのprint文で一つの頂点を出力します。
gnuplotで描くためにこのような出力形式になっています。
シェルピンスキーのギャスケットを描くためには、辺の中点の座標を順々に求めていくことが必要になります。
その部分がelse以下になります。紙に図を描いてもらえればわかると思います。
maxlevelはどの程度細かくしていくかを表す数字です。
maxlevelを大きな値にすれば三角形はどんどん細かくなっていきます。
if文でlevelとmaxlevelを比較しています。
そして一番小さな三角形の頂点からprintで出力していきます。
実行、そしてgnuplotで描く
sierpinskigasket.py > output.txt
でoutput.txtに結果を保存してみましょう。
すると以下のようなoutput.txtができます。
0.0 0.0
0.0078125 0.0
0.0078125 0.0
0.00390625 0.0078125
0.00390625 0.0078125
0.0 0.0
0.0078125 0.0
0.015625 0.0
これをgnuplotを使ってプロットします。コマンドは以下のとおりです。
plot 'output.txt' with lines
これで簡単にプロットできます。
このままだと線の色やグラフの縦横比などがデフォルトなので、変更してみてください。
以下の記事を参考にさせていただきました。
https://qiita.com/sci_Haru/items/a6faca220972278ad5cc
https://arakan-pgm-ai.hatenablog.com/entry/2018/12/19/090000