バーニー龍(Barnsley Dragon)

バーニー龍(Barnsley Dragon)

バーニー龍(Barnsley Dragon)は、数学的なフラクタルであり、フラクタルジオメトリの一例です。

これは、1988年にマイケル・バーンズリー(Michael Barnsley)によって提案されました。
バーニー龍は、確率的な方法で生成されるフラクタル図形であり、自己相似性を示します。

バーニー龍の生成は、$2$つの確率的な変換に基づいています。
これらの変換は、$4\times4$の行列で表され、点を新しい位置に移動させます。

その後、ランダムに変換が選択され、次の位置に点が移動します。
このプロセスを繰り返すことで、複雑なフラクタル図形が生成されます。

バーニー龍は、ジュリア集合の一種であり、幾何学的に美しいパターンを持ちます。
多くの場合、計算機グラフィックス美術数学の教育などの分野で使用され、その視覚的な魅力と数学的な興味深さから広く注目されています。

ソースコード

以下は、Pythonを使用してバーニー龍を生成し、matplotlibを使用してグラフ化する例です。

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
26
27
28
29
30
31
32
33
34
35
36
37
import numpy as np
import matplotlib.pyplot as plt

def barnsley_dragon(n_points):
# 初期点
x, y = 0, 0
# バーニー龍の変換確率
p = [0.7875, 0.2125]
# 変換行列
m = np.array([[0.824074, 0.281482, -0.212346, 0.864198, 1.6, -0.4],
[-0.212346, 0.864198, 0.281482, 0.824074, 0.0, 1.6]])

points = [(x, y)]
for _ in range(n_points):
# ランダムに変換を選択
i = np.random.choice(range(len(p)), p=p)
# 変換を適用
x, y = m[i, 0]*x + m[i, 1]*y + m[i, 4], m[i, 2]*x + m[i, 3]*y + m[i, 5]
points.append((x, y))

return points

def plot_barnsley_dragon(points):
# バーニー龍を描画
plt.figure(figsize=(8, 8))
plt.title("Barnsley Dragon")
plt.scatter(*zip(*points), s=0.2, color='green')
plt.axis('equal')
plt.axis('off')
plt.show()

# ポイントの数
n_points = 100000
# バーニー龍の生成
points = barnsley_dragon(n_points)
# バーニー龍の描画
plot_barnsley_dragon(points)

このコードは、指定された数の点を生成し、それらの点をmatplotlibを使用してプロットします。

[実行結果]

ソースコード解説

ソースコードを説明します。

1. NumPyとMatplotlibのインポート:

1
2
import numpy as np
import matplotlib.pyplot as plt

この部分は、NumPyMatplotlibをインポートしています。
NumPyは数値計算のためのライブラリであり、Matplotlibはグラフの描画や可視化のためのライブラリです。

2. バーニー龍の生成関数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def barnsley_dragon(n_points):
# 初期点
x, y = 0, 0
# バーニー龍の変換確率
p = [0.7875, 0.2125]
# 変換行列
m = np.array([[0.824074, 0.281482, -0.212346, 0.864198, 1.6, -0.4],
[-0.212346, 0.864198, 0.281482, 0.824074, 0.0, 1.6]])

points = [(x, y)]
for _ in range(n_points):
# ランダムに変換を選択
i = np.random.choice(range(len(p)), p=p)
# 変換を適用
x, y = m[i, 0]*x + m[i, 1]*y + m[i, 4], m[i, 2]*x + m[i, 3]*y + m[i, 5]
points.append((x, y))

return points

この部分は、バーニー龍を生成する関数です。
バーニー龍は確率的な方法で生成されるため、初期点から始めてランダムな変換を繰り返し適用します。

3. バーニー龍の描画関数:

1
2
3
4
5
6
7
8
def plot_barnsley_dragon(points):
# バーニー龍を描画
plt.figure(figsize=(8, 8))
plt.title("Barnsley Dragon")
plt.scatter(*zip(*points), s=0.2, color='green')
plt.axis('equal')
plt.axis('off')
plt.show()

この部分は、バーニー龍を描画する関数です。
matplotlib.pyplot.scatterを使用して、生成された点をプロットし、matplotlib.pyplot.showでグラフを表示します。

4. バーニー龍の生成と描画:

1
2
3
4
5
6
# ポイントの数
n_points = 100000
# バーニー龍の生成
points = barnsley_dragon(n_points)
# バーニー龍の描画
plot_barnsley_dragon(points)

この部分では、指定された数の点を生成し、barnsley_dragon関数でバーニー龍を生成し、plot_barnsley_dragon関数で描画しています。

結果解説

[実行結果]

以下は、グラフに表示される内容の詳細です。

1. バーニー龍の生成:

barnsley_dragon関数は、指定された数の点を生成します。
この関数は、バーニー龍の確率的な変換を実行し、各変換に基づいて点を移動します。
バーニー龍は、$2$つの確率変換からなり、各変換には$6$つの変換行列のパラメータがあります。
これらのパラメータは、バーニー龍の形状と配置に影響します。

2. グラフの描画:

plot_barnsley_dragon関数は、生成された点をmatplotlibを使用してプロットします。
各点は緑色の小さな円で表示され、その位置はバーニー龍の形状を反映しています。
グラフのタイトルは「Barnsley Dragon」となっています。

3. グラフの設定:

plt.figure関数によって、図のサイズが設定されています。
plt.title関数によって、グラフにタイトルが追加されます。
plt.scatter関数は、点を散布図としてプロットします。
plt.axis('equal')によって、$x$軸と$y$軸の比率が等しくなります。
plt.axis('off')は、$x$軸と$y$軸の目盛りや枠線を非表示にします。

4. 表示される内容:

グラフに表示される内容は、生成されたバーニー龍の形状です。
バーニー龍は、幾何学的に複雑なフラクタル構造を持つ図形であり、ランダムな変換を繰り返すことで生成されます。
このグラフは、そのようなフラクタル図形の一例を示しています。