読者です 読者をやめる 読者になる 読者になる

tumblr

tumblr(タンブラー)は、メディアミックスブログサービス。ブログとミニブログ、そしてソーシャルブックマークを統合したマイクロブログサービスである。アメリカのDavidville.inc(現: Tumblr, Inc.)により2007年3月1日にサービスが開始された。

rubyでシェルピンスキーのガスケット

http://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB%E3%83%94%E3%83%B3%E3%82%B9%E3%82%AD%E3%83%BC%E3%81%AE%E3%82%AE%E3%83%A3%E3%82%B9%E3%82%B1%E3%83%83%E3%83%88

require "RMagick"

class Gasket
  include Magick

  def initialize
    @start = [
      [60, 0],
      [0, 120],
      [120, 120]
    ]
    @img = Magick::ImageList.new
    @img.new_image(120, 120){self.background_color = "white"}
    @gc = Magick::Draw.new
  end

  def gasket(p0, p1, p2)
    m0 = middle_point(p0, p1)
    m1 = middle_point(p0, p2)
    m2 = middle_point(p1, p2)
    @gc.fill("black")
    @gc.polygon(p0[0], p0[1], p1[0], p1[1], p2[0], p2[1])
    @gc.fill("white")
    @gc.polygon(m0[0], m0[1], m1[0], m1[1], m2[0], m2[1])
    if (p0[0] - m0[0]).abs > 2
      gasket(p0, m0, m1)
      gasket(p1, m0, m2)
      gasket(p2, m1, m2)
    else
      @stack += 1
      return
    end
  end

  def middle_point(s, e)
      middleX = s[0] - (s[0] - e[0])/2
      middleY = s[1] - (s[1] - e[1])/2
      return [middleX, middleY]
  end

  def run
    gasket(@start[0], @start[1], @start[2])
    @gc.draw(@img)
    @img.write("gasket.bmp")
  end
end

gasket = Gasket.new
gasket.run

正三角形の各点の中点を結んでできた逆正三角形を白く、それ以外のエリアは黒くぬりつぶす。
で、その処理を再帰的に行う。

メソッドgasketの中身が汚いのでもう少しなんとかしたいんだけど…なんとかしたいんだけど…方法がわからん…