L-system で描いた再帰曲線の例

obelisk.hatenablog.com
前回のエントリで Ruby で実装してみた L-system を使って、実際に再帰曲線を描いてみます。Gem 'kaki-lsystem' が必要です。


C曲線。
20180323002343
コード。

require 'kaki/lsystem'

l = Lsystem.new(600, 500, "C curve")
l.move(-130, 100)
l.prologue do
  clear(color(0x2b5, 0x60ff, 0x5d89))
  color(0xfc9e, 0xe0aa, 0x7ac7)
end
l.set("-") {left(45)}
l.set("+") {right(45)}
l.set("F") {forward(8)}
l.init("F")
l.rule("F", "+F--F+")
l.draw(10)

以下、require 'kaki/lsystem' は書きません。


コッホ・アイランド。
20180322043252
コード。

l = Lsystem.new(600, 600, "Koch island")
l.move(-150, -150)
l.prologue do
  clear(color(0xffff, 0xf600, 0xf540))
  color(0x28a5, 0xa3c8, 0xca7)
end
l.set("-") {left(90)}
l.set("+") {right(90)}
l.set("F") {forward(8)}
l.init("F-F-F-F")
l.rule("F", "F+FF-FF-F-F+F+FF-F-F+F+FF+FF-F")
l.draw(2)

 

ペンローズ・タイル
20180322042852
コード。

l = Lsystem.new(600, 600, "Penrose Tiling")
l.prologue do
  clear(color(0xe013, 0xfee3, 0xfee3))
  color(0xffff, 0x5feb, 0xe51f)
end
l.set("-") {left(36)}
l.set("+") {right(36)}
walk = proc {forward(10)}
l.set("M", &walk)
l.set("N", &walk)
l.set("O", &walk)
l.set("P", &walk)
l.set("A", &walk)
l.init("[N]++[N]++[N]++[N]++[N]")
l.rule("M", "OA++PA----NA[-OA----MA]++")
l.rule("N", "+OA--PA[---MA--NA]+")
l.rule("O", "-MA++NA[+++OA++PA]-")
l.rule("P", "--OA++++MA[+PA++++NA]--NA")
l.rule("A", "")
l.draw(5)

 

Sierpinski arrowhead。続けると「シェルピンスキーのギャスケット」になります。
20180324150434
コード。

n = 6
length = n.zero? ? 500 : 500.0 / 2 ** n

l = Lsystem.new(520, 500, "Sierpinski arrowhead")
l.move(-250, -240)
l.prologue do
  clear(color(0xffff, 0xef5b, 0xf677))
  color(0x12de, 0x5320, 0xb4a)
end
l.set("-") {left(60)}
l.set("+") {right(60)}
l.set("L") {}
l.set("R") {}
l.set("F") {forward(length)}
l.init("LF")
l.rule("L", "-RF+LF+RF-")
l.rule("R", "+LF-RF-LF+")
l.rule("F", "")
l.draw(n)

 
 
20180324150916
コード。

l = Lsystem.new(500, 500)
l.move(50, -230)
l.prologue do
  clear(color(0xd467, 0xfbab, 0xd0c7))
  color(0xe713, 0x5742, 0xff23)
end
l.set("-") {left(90)}
l.set("+") {right(90)}
l.set("F") {forward(10)}
l.init("F-F-F-F")
l.rule("F", "FF-F-F-F-F-F+F")
l.draw(3)

 
 
草っぽいの。
20180323002349
コード。

l = Lsystem.new(500, 500)
l.move(-150, -240)
l.prologue do
  clear(color(0xf7d3, 0xffff, 0xc99b))
  color(0x30e3, 0x8636, 0x10d2)
end
l.dir = Vector[0, 1]
l.set("-") {left(10)}
l.set("+") {right(15)}
l.set("F") {forward(13)}
l.set("X") {}
l.set("Z") {}
l.init("X")
l.rule("F", "FX[FX[+XF]]")
l.rule("X", "FF[+XZ++X-F[+ZX]][-X++F-X]")
l.rule("Z", "[+F-X-F][++ZX]")
l.draw(4)

 

ペアノ・ゴスペル曲線。
20180325031914
コード。

l = Lsystem.new(600, 550, "Peano-Gosper curve")
l.move(80, 250)
l.prologue do
  clear(color(0x5968, 0x5968, 0x5968))
  color(0x8024, 0xffff, 0x653)
end
l.set("-") {left(60)}
l.set("+") {right(60)}
l.set("F") {forward(9)}
l.set("X") {}
l.set("Y") {}
l.init("X")
l.rule("X", "X+YF++YF-FX--FXFX-YF+")
l.rule("Y", "-FX+YFYF++YF+FX--FX-Y")
l.draw(4)