GTK+ で落書き 14(Ruby)


自作の Gem 'oekaki' を使っています。
oekaki | RubyGems.org | your community gem host
GTK+でお絵かきしてみた(Ruby) - Camera Obscura
 
oekaki_sample17.rb

require 'oekaki'

Width = 500
circles = []    #作った円の情報を保持しておく配列

check = ->(x, y, r) {
  return false if x < r or y < r or x > Width - r or y > Width - r
  circles.each do |x1, y1, r1|
    l = Math.sqrt((x1 - x) ** 2 + (y1 - y) ** 2)
    return false if l < r + r1
  end
  circles << [x, y, r]
  true
}

Oekaki.app width: Width, height: Width do
  draw do
    clear(color(0xadff, 0xd8ff, 0xe6ff))    #lightblue
  end
  
  id = timer(100) do
    catch(:jump) do
      x = y = r = i = 0
      
      #円を一個生成する
      loop do
        x, y = rand(Width), rand(Width)
        r = rand(10..100)
        break if check.(x, y, r)
        i += 1
        if i > 10000    #円が混み過ぎたら終了
          timer_stop(id)
          puts "stop"
          throw(:jump)
        end
      end
      
      color(rand(0x10000), rand(0x10000), rand(0x10000))
      circle(true, x, y, r)
    end
    
    true
  end
end

つまらないものなのですけれど、じつは Kernel#rand の引数に Range オブジェクトを使ってみたかっただけなのでした…。一箇所だけ、わかりますかね。