LoginSignup
2
2

More than 5 years have passed since last update.

フラクタル "シェルピンスキーのギャスケット"をpython+gnuplotでシンプルに描く

Last updated at Posted at 2019-02-16

はじめに

フラクタルのひとつにシェルピンスキーのギャスケットというものがあります。
シェルピンスキーのギャスケット.PNG

フラクタルの特徴に”自己相似形”があります。まさにシェルピンスキーのギャスケットはその特徴を持っています。拡大しても同じ三角形(逆三角形?)が見えてきます。
そしてもう一つの特徴は三角形の中身がスカスカなことです。
三角形を大きくしていくと面積が増えるのに密度が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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2