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

GTK+でヒルベルト曲線(Ruby)

前記事Ruby/GTK+ 用のモジュールを使って、ヒルベルト曲線を描いてみました。Ruby/Tk 版(参照)と殆ど同じです。

require './mygtk'

class Draw
  def initialize(n, slot)
    @lgth = Width / 2 ** n
    @y = (Width - @lgth * (2 ** n - 1)) / 2  #見栄えを整えているだけで、特に意味のない計算
    @x = Width - @y
    @oldx, @oldy = @x, @y
    @slot = slot
  end
  
  def ldr(n)
    return if n == 0
    dlu(n - 1); @x -= @lgth; dline
    ldr(n - 1); @y += @lgth; dline
    ldr(n - 1); @x += @lgth; dline
    urd(n - 1)
  end
  
  def urd(n)
    return if n == 0
    rul(n - 1); @y -= @lgth; dline
    urd(n - 1); @x += @lgth; dline
    urd(n - 1); @y += @lgth; dline
    ldr(n - 1)
  end
  
  def rul(n)
    return if n == 0
    urd(n - 1); @x += @lgth; dline
    rul(n - 1); @y -= @lgth; dline
    rul(n - 1); @x -= @lgth; dline
    dlu(n - 1)
  end
  
  def dlu(n)
    return if n == 0
    ldr(n - 1); @y += @lgth; dline
    dlu(n - 1); @x -= @lgth; dline
    dlu(n - 1); @y -= @lgth; dline
    rul(n - 1)
  end
  
  def dline
    firebrick  = @slot.color(45568,  8704,  8404)
    @slot.line(@oldx, @oldy, @x, @y, firebrick)
    
    @oldx, @oldy = @x, @y 
  end
end


Width = 400

MyGtk.app width: Width, height: Width, title: "Hilbert curve" do
  draw do
    ghostwhite = color(63488, 63488, 65535)
    rectangle(true, 0, 0, Width, Width, ghostwhite)
    
    n = (ARGV[0] || 5).to_i  #次数を引数に。デフォルトは5次
    exit if n < 1
  
    Draw.new(n, self).ldr(n)
  end
end

MyGtk.app のブロックの外へメソッドを持ち出したければ、self を持ち出してインスタンスにすれば可能です。Drawクラスでは @slot にブロック内の self が入っています。