ある再帰曲線を描く(Ruby)

フィボナッチのうさぎ―数学探険旅行

フィボナッチのうさぎ―数学探険旅行

この本で言及されている再帰曲線を Ruby で描いてみました。何という名前なのか、はたして名前があるのか、よく知りません。

こんなです。左が 3次、右が 5次です。

 
描画には自作の Gem 'oekaki' を使いました。最新バージョンでタートルグラフィックスをサポートしています(参照)。
oekaki | RubyGems.org | your community gem host
GTK+でお絵かきしてみた(Ruby) - Camera Obscura
 
コード。

require 'oekaki'

Oekaki.app width: 420, height: 420, title: "Turtle" do
  draw do
    clear
    
    t = Oekaki::Turtle.new
    t.color(0, 0xffff, 0)
    
    drawing = lambda do |n, p1, p2|
      v1 = p2 - p1
      v2 = Vector[-v1[1], v1[0]]
      if n == 1
        l = v1.norm / sqrt(2)
        t.move(*p1.to_a)
        t.dir = v1.normalize
        t.left(45)
        t.forward(l)
        t.right(90)
        t.forward(l)
      else
        drawing[n - 1, v3 = p1 + v2 / 2, p1]
        drawing[n - 1, v3, v4 = v3 + v1 / 2]
        drawing[n - 1, v4, v5 = v4 + v1 / 2]
        drawing[n - 1, p2, v5]
      end
    end
    
    drawing[5, Vector[-200, -200], Vector[200, -200]]
  end
end

 

ゴシック・フリーズ(p.102~)。それぞれ 1, 2, 3, 6次。


 
コード。

require 'oekaki'

Oekaki.app width: 420, height: 420, title: "Turtle" do
  draw do
    clear
    
    t = Oekaki::Turtle.new
    t.color(0xffff, 0x45ff, 0)    #orangered
    t.move(-200, -200)
    t.left(45)
    
    drawing = lambda do |n, l|
      if n == 1
        t.forward(l)
      else
        drawing[n - 1, l / 3]
        t.left(90) 
        drawing[n - 1, l / 3] 
        t.right(90)
        drawing[n - 1, l / 3] 
        t.right(90)
        drawing[n - 1, l / 3] 
        t.left(90)
        drawing[n - 1, l / 3] 
      end
    end
    
    drawing[6, 400 * sqrt(2)]
  end
end

 
アニメーション版も作ってみました。コードはこちら

 

タートルグラフィックスによるその他の再帰曲線については、こちらもどうぞ。