Ruby で「L-system」の実装

休日(春分の日)。雨。
たくさん寝たのだが、目覚ましで起きても眠すぎる。もう少しうとうとする。調子は悪く、午前中は睡眠の後始末でおしまい。

昼。雨だが当分行けないので県営プールまで行ったら、駐車場が満車で入れなかった。どうやら FC岐阜のホーム戦があるらしい。そうか、J2 の試合は水曜日だし今日は休日だからな。まあドライブしてくることになって気分転換になったからいいけれど。
 

ウチの木瓜(ぼけ)の花なのだが、雨のせいかいまひとつきれいでないね。

Ruby再帰曲線を描く言語「L-system」を実装していた。結構うまくいったと思う。例えばこんな風なのが描ける。
20180322043252
20180322042852
上が「コッホ・アイランド」、下が「ペンローズ・タイル」。ペンローズ・タイルのコードはこんな感じ。

require 'kaki/lsystem'

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)

lsystem.rb というのがライブラリの本体で、頑張ってGem化もした。もう夜中の 2時すぎなので、プログラミング・ブログの記事は明日書く。