虹を円を描くように
虹を作りたくてですね
いつものように、DXRubyいじってたら、
どうも虹を画面上に作りたくなってしまってですね。
作ってみました。
作り方を考える
- http://38873321.at.webry.info/200911/article_7.html
- http://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93
上記のURLを見ると、RGBではなくHSVを使うようだ。
色相(Hue)を変化させていくのか。
Wikipediaでは公式も乗ってたので、参考にしてスクリプトにした。
require "dxruby"
image = Image.new(640, 480)
def hsvToRGB(hsv)
h, s, v = hsv.collect{|n| n.to_f }
return [v, v, v] if s == 0
hi = (h / 60).to_i % 6
f = h / 60 - hi
pl = v * (1 - s)
ql = v * (1 - f * s)
tl = v * (1 - (1 - f) * s)
case hi
when 0
ret = [v, tl, pl]
when 1
ret = [ql, v, pl]
when 2
ret = [pl, v, tl]
when 3
ret = [pl, ql, v]
when 4
ret = [tl, pl, v]
when 5
ret = [v, pl, ql]
else
raise "out of range"
end
ret.collect{|r| r * 255}
end
drawRainbow = lambda {|w, r|
w.times do |i|
image.circleFill(320, 240, r - i, hsvToRGB([i * (360 / w), 1.0, 1.0]))
end
# 真ん中を黒く塗りつぶしている。真ん中がcircleFillで赤になっちゃうので
image.circleFill(320, 240, r - w, [0,0,0])
}
drawRainbow.call(50, 200)
Window.loop do
Window.draw(0, 0, image)
end
ImageオブジェクトでcircleFillとかやっとくと、
それを書き換えるとかじゃない場合にはフレームごとに
circleFillとかやらなくてすむ。
うん、面白かったです。



















