💻

【Julia】でバーンスレイのシダを描こう

2024/01/01に公開

はじめに

明けましておめでとうございます。2024年もよろしくお願いします。

Juliaでバーンスレイのシダを描きたいと思います。

▼バーンスレイのシダとは

https://ja.wikipedia.org/wiki/バーンズリーのシダ

バーンスレイのシダとは、植物の形をモデル化しようと数学的に生成されるパターンです。フラクタル図形として表され、拡大しても同じ図形が現れ続ける面白い性質があります。

出力の際、「Images」「ImageView」パッケージを利用します。

実装

4つの関数を定義します。

#4つの関数の定義

f1 = (x,y) -> (0., 0.16*y)
f2 = (x,y) -> (0.85*x + 0.04*y, -0.04*x + 0.85*y + 1.6)
f3 = (x,y) -> (0.2*x - 0.26*y, 0.23*x + 0.22*y + 1.6)
f4 = (x,y) -> (-0.15*x + 0.28*y, 0.26*x + 0.24*y + 0.44)
fs = [f1, f2, f3, f4]

上記の式を利用し、画像行列を生成します。x,y各座標を条件に従って更新していきます。

# 計算回数
num = 50000
# Canvas size (pixels)
width, height = 300, 300
image = zeros((width, height))

x, y = 1, 1
for i in 1:num
    
    # ランダムに指定の確率に従って関数が選ばれる
    
    r = rand((1:100))
    if r<=1
        f = fs[1]
    elseif r<=86
        f = fs[2]
    elseif r<=93
        f = fs[3]
    else
        f = fs[4]
    end
        
    x, y = f(x,y)

    #配置を真ん中あたり移動
    #小数を整数に変換
    ix, iy = convert(Int,round(width / 2 + x * width / 10)), convert(Int, round(y * height / 12+1))
    # Set this point of the array to 1 to mark a point in the fern
    #白ドットを打つ、縦方向
    image[ix, iy] = 1.0
end

可視化します。

# 全体図
using Images, ImageView

# 90度回転して出力
img = colorview(Gray, rotl90(image,1))

以下のようにシダの形が表示されました。

image.png

GitHubで編集を提案

Discussion