「シェルピンスキーのギャスケット」を 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 の再帰を使って反復を実装しています。