概要

再帰曲線を描く「L-system」を実装しています。内部で Gem 'oekaki' のタートルグラフィックス機能を使っています。よって、Gem 'oekaki' をインストールすることが必要です。

methods

  • Lsystem.new(width, height, title = "L-system")
    • インスタンスを生成します。width, height はウィンドウのサイズです。
  • move(x, y)
    • ペンの初期位置を移動させます。y方向は上が + です。
  • prologue do ... end
    • ブロック内が描画前に実行されます。
  • set(command) do ... end
    • 与えられた command(長さ1の文字列)について、ブロック内を実行するように設定します。
    • commandの「[」「]」はそれぞれスタックのプッシュ、ポップです。
  • init(str)
    • str は開始時の手続きです。
  • rule(command, str)
    • command を再帰的に展開するルールです。
  • draw(n)
    • 再帰的に深さnだけ実行します。n = 0 ならば init(str) で指定された手続きのみ実行します。

ブロック内は Oekaki::Turtle クラスのメソッドを使います。left(), right(), forward(), color(), circle(), move(), back() など。下のURL参照。
http://obelisk.hatenablog.com/entry/2018/02/06/025222

プロパティ

  • dir
    • 開始時の方向を指定します。初期値は Vector[1, 0] です。Vector の長さは1にして下さい。

require 'kaki/lsystem'

n = 7
length = n.zero? ? 500 : 500.0 / 2 ** (n - 1)

l = Lsystem.new(520, 500, "Sierpinski gasket")
l.move(-250, -240)
l.prologue {color(0x55c5, 0xe363, 0xf1d5)}
l.set("-") {left(120)}
l.set("F") {forward(length)}
l.set("G") {forward(length, false)}
l.init("F")
l.rule("F", "F-F-F-GG")
l.rule("G", "GG")
l.draw(n)
require 'kaki/lsystem'

l = Lsystem.new(400, 640)
l.move(50, -310)
l.prologue {color(0x28a5, 0xa3c8, 0xca7)}
l.dir = Vector[0, 1]
l.set("-") {left(15)}
l.set("+") {right(15)}
l.set("F") {forward(10)}
l.init("F")
l.rule("F", "F[+F-F-F]F[--F+F+F]")
l.draw(4)