シェルピンスキーのガスケット

シェルピンスキーのガスケット

シェルピンスキーのガスケットは、数学的なフラクタルの一種であり、無限に続く小さな三角形から構成される図形です。

このガスケットはポーランドの数学者カジミェシュ・シェルピンスキーによって考案されました。

シェルピンスキーのガスケットは、次のような特徴を持っています。

1. 階層的な構造:

シェルピンスキーのガスケットは、再帰的なプロセスによって構築されます。
最初に正三角形を描き、その三辺の中点を結んで中央の小さな三角形を作ります。
そして、再帰的にこのプロセスを繰り返し、それぞれの小さな三角形に対して同じ操作を行います。
これにより、ガスケット全体が階層的な構造を持ちます。

2. 自己相似性:

シェルピンスキーのガスケットは、自己相似性を示します。
つまり、ガスケット全体が小さな部分にも似た形状やパターンを持っています。
これは、再帰的なプロセスが同じ操作を繰り返し適用することによって生じます。

3. フラクタル性:

シェルピンスキーのガスケットフラクタルの一種であり、無限に細かい構造が繰り返されるため、無限の解像度で見るとその複雑さが保たれます。
これにより、ガスケットの外形の長さや面積は有限ですが、その中の構造は無限に続きます。


シェルピンスキーのガスケットは、数学的な美しさと興味深さを持ち、コンピューターグラフィックスフラクタル幾何学などの分野で広く使用されています。

ソースコード

シェルピンスキーのガスケットをPythonで解くためには、matplotlibnumpyなどのライブラリを使用します。
以下は、Pythonでシェルピンスキーのガスケットを生成し、グラフ化するサンプルコードです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import numpy as np
import matplotlib.pyplot as plt

def midpoint(p1, p2):
return (0.5 * (p1[0] + p2[0]), 0.5 * (p1[1] + p2[1]))

def sierpinski(points, depth):
colors = ['r', 'g', 'b']
for i in range(3):
plt.plot([points[i][0], points[(i+1)%3][0]], [points[i][1], points[(i+1)%3][1]], color=colors[i])
if depth > 0:
sierpinski([points[0], midpoint(points[0], points[1]), midpoint(points[0], points[2])], depth-1)
sierpinski([points[1], midpoint(points[0], points[1]), midpoint(points[1], points[2])], depth-1)
sierpinski([points[2], midpoint(points[2], points[1]), midpoint(points[0], points[2])], depth-1)

def main():
points = [(0, 0), (1, 0), (0.5, np.sqrt(3)/2)]
plt.figure(figsize=(6, 6))
sierpinski(points, 5) # 深さ5のシェルピンスキーのガスケットを生成
plt.axis('equal')
plt.axis('off')
plt.show()

if __name__ == "__main__":
main()

このコードでは、まず基本となる三角形の頂点を定義し、その三角形の各辺の中点を計算して新たな三角形を作り出す再帰関数を定義しています。

そして、再帰関数を使用して指定した深さまでシェルピンスキーのガスケットを描画します。

[実行結果]

ソースコード解説

このソースコードは、Pythonとmatplotlibを使用してシェルピンスキーのガスケットを生成し、グラフ化するものです。
以下は、各部分の詳細な説明です。

1. midpoint 関数:

1
2
def midpoint(p1, p2):
return (0.5 * (p1[0] + p2[0]), 0.5 * (p1[1] + p2[1]))

この関数は、二つの点 p1p2 の中点を計算します。
それぞれの点は (x, y) の座標を持つタプルで表されます。
中点の座標は、各次元の座標の平均値を取ることで計算されます。

2. sierpinski 関数:

1
2
3
4
5
6
7
8
def sierpinski(points, depth):
colors = ['r', 'g', 'b']
for i in range(3):
plt.plot([points[i][0], points[(i+1)%3][0]], [points[i][1], points[(i+1)%3][1]], color=colors[i])
if depth > 0:
sierpinski([points[0], midpoint(points[0], points[1]), midpoint(points[0], points[2])], depth-1)
sierpinski([points[1], midpoint(points[0], points[1]), midpoint(points[1], points[2])], depth-1)
sierpinski([points[2], midpoint(points[2], points[1]), midpoint(points[0], points[2])], depth-1)

この関数は、与えられた三角形の頂点を受け取り、指定された深さまでシェルピンスキーのガスケットを描画します。
各三角形の辺は異なる色で描かれます。
再帰的なアプローチが使用され、各三角形はその頂点の中点を使って三つの小さな三角形に分割されます。

3. main 関数:

1
2
3
4
5
6
7
def main():
points = [(0, 0), (1, 0), (0.5, np.sqrt(3)/2)]
plt.figure(figsize=(6, 6))
sierpinski(points, 5) # 深さ5のシェルピンスキーのガスケットを生成
plt.axis('equal')
plt.axis('off')
plt.show()

この関数は、プログラムのエントリーポイントとして機能します。
まず、基本となる三角形の頂点が定義され、sierpinski 関数が呼び出されて指定された深さまでのシェルピンスキーのガスケットを生成します。
最後に、グラフが表示されます。

4. if __name__ == "__main__"::

これは、Pythonのスクリプトが直接実行された場合に main 関数が呼び出されることを確認するための条件です。
これにより、このスクリプトが他のスクリプトからインポートされた場合には main 関数が呼び出されないようになります。


このソースコードは、シェルピンスキーのガスケット再帰的な手法を使用して生成し、matplotlibを使用してグラフ化することで、シェルピンスキーの美しい幾何学的な図形を視覚化しています。

グラフ解説

[実行結果]

このプログラムは、シェルピンスキーのガスケットを生成し、matplotlibを使用してグラフ化します。
以下は、プログラムが生成する内容の詳細な説明です。

  1. 三角形の定義:
    最初に、シェルピンスキーのガスケットを構成する基本となる三角形の頂点が定義されます。
    この例では、座標が (0, 0)(1, 0)(0.5, √3/2) の三つの頂点を持つ正三角形が使用されます。

  2. 中点の計算:
    次に、与えられた三角形の各辺の中点を計算する midpoint 関数が定義されます。
    この関数は、二つの頂点の座標を受け取り、それらの中点の座標を返します。

  3. 再帰的な描画:
    sierpinski 関数は、与えられた三角形と深さに基づいて、シェルピンスキーのガスケットを再帰的に描画します。
    具体的には、与えられた三角形の各辺の中点を使用して新しい三角形を作成し、それぞれの新しい三角形に対して再帰的に同じ処理を行います。
    深さが$0$に達するまでこの処理を繰り返します。

  4. グラフの描画:
    main 関数では、matplotlibを使用してグラフを描画します。
    sierpinski 関数を呼び出してシェルピンスキーのガスケットを描画し、plt.axis('equal')plt.axis('off')を使用して、図形のアスペクト比を保持し、軸を非表示にします。


このプログラムは、再帰的なアプローチを使用して、シェルピンスキーのガスケットを生成し、美しい幾何学的な図形を作成します。