L-system で描いた再帰曲線の例
obelisk.hatenablog.com
前回のエントリで Ruby で実装してみた L-system を使って、実際に再帰曲線を描いてみます。Gem 'kaki-lsystem' が必要です。
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'
は書きません。
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)
ペンローズ・タイル。
コード。
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。続けると「シェルピンスキーのギャスケット」になります。
コード。
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)
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)
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)
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)