「シェルピンスキーのギャスケット」を描いてみる(Ruby)

「シェルピンスキーのギャスケット」を Ruby で描いてみました。

 
フラクタルな図形なので正確ではないですが、7次まで描いてみました。描画には自作の Gem 'oekaki' を使っています。
oekaki | RubyGems.org | your community gem host
GTK+でお絵かきしてみた(Ruby) - Camera Obscura
 
コードです。
sierpinski_gasket.rb (Gist)

require 'oekaki'

Width, Height = 500, 450

Oekaki.app width: Width, height: Height, title: "Sierpinski gasket" do
  draw do
    clear
    
    x1, y1 = Width / 2, Height - Width * 0.5 * Math.sqrt(3)
    x2, y2 = 0, Height
    x3, y3 = Width, Height
    po0 = [[x1, y1], [x2, y2], [x3, y3]]
    
    color(0xff * 256, 0xd7 * 256, 0)    #gold
    polygon(true, po0)
    
    color(0, 0, 0)
    
    sg = lambda do |n, po|
      y = (po[0][1] + po[1][1]) / 2.0
      l = (po[2][0] - po[1][0]) / 2.0
      p1 = [po[1][0] + l / 2, y]
      p2 = [po[2][0] - l / 2, y]
      p3 = [po[1][0] + l, po[1][1]]
      
      polygon(true, [p1, p2, p3])
      return if n == 1
      
      sg.call(n - 1, [po[0], p1, p2])
      sg.call(n - 1, [p1, po[1], p3])
      sg.call(n - 1, [p2, p3, po[2]])
    end
    
    sg.call(7, po0)
  end
end

lambda の再帰を使って反復を実装しています。