フラクタル図形 - シェルピンスキーのギャスケット

5/28/2023

Learning Python

t f B! P L

前回のコッホ曲線に続きフラクタル図形をpythonで描画。前回の応用で描けそうなシェルピンスキーのギャスケットという図形を描いてみた。

コッホ曲線と同様に図形の一部分にズームしていくと無限に同じ図形が現れる。コッホ曲線は長さが無限大だったが、 シェルピンスキーのギャスケットは無限回計算した際に面積がゼロになる。

塗りつぶされた三角形から各辺の中点を結んでできる三角形を切り取り、辺の長さが半分の3つの三角形に分ける動作を無限に繰り返していく。上図は1回だけ実行したもの。

出力結果

今回は正三角形のみを対象にして一片の長さは可変に出来るようにした。正三角形以外の三角形や回転、他の多角形や立体への拡張も検討するとより面白いかもしれない。
n=2
n=3
n=4
n=5

n=10

n=10の左下部分拡大

n=10の計算は1分以内で出力されはしたが、作成したfigの分解能的に既に表現しきれていない様子。

Pythonコード

今回はMatplotlibのPatchesの使い方を調べはしたが、他のサイトを参考にするのではなくそれなりに一人で作成して描画まで出来た。考え方はコッホ曲線の時と同じく再帰関数を使用したが、描くのは一番小さい三角形のみで良いことに気づいたらとてもシンプルだった。


import math
import matplotlib.pyplot as plt
import matplotlib.patches as patch

# 階層深さ(n)、一辺の長さ(size)、左下位置(offset)
n = 7
size = 100
offset = [0, 0]

# シェルピンスキーを計算する関数
def sierpinski(n, size, offset):
    if n == 0:
        return

    a = offset
    b = [a[0]+size/2, a[1]+size*math.sqrt(3)/2]
    c = [a[0]+size, a[1]]
    s = [a[0]+size/4, (a[1]+b[1])/2]
    t = [a[0]+size*3/4, (a[1]+b[1])/2]
    u = [a[0]+size/2, a[1]]

    if n == 1:
        tri1 = patch.Polygon([a,s,u], fill = True)
        tri2 = patch.Polygon([s,b,t], fill = True)
        tri3 = patch.Polygon([u,t,c], fill = True)
        ax.add_patch(tri1)
        ax.add_patch(tri2)
        ax.add_patch(tri3)
        
    sierpinski(n-1, size/2, a)
    sierpinski(n-1, size/2, s)
    sierpinski(n-1, size/2, u)

# Plot作成
fig = plt.figure(figsize=(5, 5))
ax = fig.add_subplot(1,1,1)
sierpinski(n, size, offset)

# Plotの設定
ax.set_xlim(offset[0], offset[0] + size)
ax.set_ylim(offset[1], offset[1] + size)
ax.set_aspect('equal')

# 描画
plt.show()


ハウスドルフ次元について

フラクタル図形についてインターネット検索していると、ハウスドルフ次元というものがあるらしい。Wikipediaを見ても何やら複雑すぎる説明でよくわからないかったが、大阪大学の角教授の資料によると、下記の様に書いてある;

”フラクタル図形の大きさをはかるものとして、t次元ものさし(tは任意の実数)があり、それがちょうどいい具合になるtを図形の「ハウスドルフ次元」とよぶ。”

...

これでも良くわからない。もうちょっと数学をまじめに勉強しておかないとこの手の定義は理解できない。今日はあまり深いこと考えたくないため、また今度読み直すこととする。(これだから何事にも学習が進まない)


参考にしたサイト


このブログを検索

ラベル

Outdoor (21) 3D Printer (12) Raspberry Pi (10) Learning (9) Movie (7) Pico (6) FreeCAD (5) Game (5) Blog (4) MSFS (4) Python (4) Gadget (1) Unity (1)

ブログ アーカイブ

About

思い付きで始めた様々なコトをやった感想やメモ、Web上で見つけた後々役立ちそうなコトなどをまとめてます。 万人の役に立つコンテンツではなく自分用メモ的な内容ですが、何かの役に立てば幸いです

人気の投稿

QooQ