L-systemでフラクタル図形

未分類

L-systemは相似図形やフラクタル図形を描くアルゴリズムとして利用される。今回は、タートルグラフィクスを使用して書いてみる。

フラクタル図形は、一部を拡大してゆくと、また自分と同じ形の部分が現れる図形のこと。L-systemからみてみれば、初期状態の線分があって、その一部分をずっと同じ置換ルールの線分で書き換えてゆく、という風にとらえることができる。

コッホ曲線(雲形曲線)

フラクタル図形の例として、雲形曲線を描いてみる。

初期状態の線分(イニシエータ)は以下の線分。

イニシエータを置換する線分(ジェネレータ)は以下の線分。

つまり、

  • 前進する

が、以下に変換される。

  • 前進する
  • 左に60度曲がる
  • 前進する
  • 右に60度曲がる
  • 右に60度曲がる
  • 前進する
  • 左に60度曲がる
  • 前進する

タートルグラフィックスで実装してみる

要素実装
V(置換規則で置換される文字)F:前進する
S(不変の文字)+:右に60度曲がる
-:左に60度曲がる
ω(初期状態)F
P(置換規則)F→F-F++F-F

5回繰り返しで実行してみた。ソースコードは以下の通り

import turtle
t = turtle.Turtle()

omega = "F"
P = {"F":"F-F++F-F"}
repeat = 5
distance = 3
angle = 60

def turtle2(com):
    if com == "F":
        t.forward(distance)
    if com == "+":
        t.right(angle)        
    if com == "-":        
        t.left(angle)

result = omega
for i in range(repeat):
    result = result.translate(str.maketrans(P))
for x in result:
    turtle2(x)

turtle.done()

結果は以下の通り

おまけで、初期状態を正三角形(omega=”F++F++F”),3回繰り返し(repeat = 3)で実行した結果がこちら

タイトルとURLをコピーしました