こんな感じで如何でしょう?
黒⇒青⇒紫⇒赤⇒黄⇒白 1280階調
R G B
FFFFFF 1279
FFFF00 1023
FF0000 767
FF00FF 511
0000FF 255
000000 0
VBのコードです。(levelは0~1の実数)
単純に書いてます。エレガントなアルゴリズムは思い浮かびませんでした。
index = int(1280 * level)
group = int(index / 256)
select case group
case 0:
R=0
G=0
B=index
case 1:
R=index mod 256
G=0
B=255
case 2:
R=255
G=0
B=255 - index mod 256
case 3:
R=255
G=index mod 256
B=0
case 4:
R=255
G=255
B=index mod 256
case 5:
R=255
G=255
B=255
end select
Color = RGB(R,G,B)
HSV(HSB)色空間を用いれば綺麗にできますよ。
http://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93
サーモグラフィ風のバーを作るのであればこんなイメージになります。
http://akebi.jp/bns/hsvp_manual.html
↑の(色相の)青から赤を使用すれば良いのではないでしょうか。
実装するには、彩度と明度を固定値にして色相を(0~1の)値によって変化させます。
0の場合は色相の青の値にして、1の場合は赤になるようプログラムすればよいわけです。
HSV→RGB、RGB→HSV変換のプログラムはこちらです。
彩度と明度を固定すると提示した画像のように濃~淡にならないように思います
また、赤は0.5付近で出てきているので1を赤にするのはちょっと違う気がするのです。
RGBの変化を調べてみましたが、数式で表すのは結構面倒な感じでした。
0~1を適当な区間(たとえば10段階)に分けて各区切りのRGB値を取得しておき、
途中の値は補完してしまうという方法はどうでしょう。
とりあえず、10段階に分けて各点のRGB値を拾ってみました。(おおざっぱに0~250。)
0.0 | 0.1 | 0.2 | 0.3 | 0.4 | 0.5 | 0.6 | 0.7 | 0.8 | 0.9 | 1.0 | |
R | 0 | 12 | 90 | 160 | 200 | 225 | 240 | 250 | 250 | 250 | 250 |
G | 0 | 0 | 0 | 0 | 0 | 40 | 90 | 140 | 190 | 240 | 250 |
B | 0 | 120 | 150 | 150 | 120 | 10 | 0 | 0 | 10 | 120 | 250 |
Bが複雑に変化しています。
ここで、たとえば0.54地点のGを求める場合を考えて見ます。
0.5地点=40と0.6地点=90の間の値で、ちょっと0.5地点寄り。
直線的に補完してしまって問題ないかと思いますので、
(90-40)=50の10分の4である20を0.5地点の値40に足した60が答え。
といった感じで、以下のプログラムにしてみました。
0~100(100も含む)の値について、カラーバーを書かせています。
言語はちょっとマイナーですが、手軽にこういう実験ができるHSPです。http://hsp.tv/
mtbl=10 /* 有効な区間の数 */ msub=10 /* 1区間の分割数 */ /* 配列代入(最後の1要素はエラー回避用)*/ tr= 0, 12, 90,160,200,225,240,250,250,250,250,250 tg= 0, 0, 0, 0, 0, 40, 90,140,190,240,250,250 tb= 0,120,150,150,120, 10, 0, 0, 10,120,250,250 cls 1:color 0,0,0:boxf 0,160,640,450 for x,0,mtbl*msub+1,1 xa=x/msub xb=x\msub fr=tr(xa)+(tr(xa+1)-tr(xa))*xb/msub fg=tg(xa)+(tg(xa+1)-tg(xa))*xb/msub fb=tb(xa)+(tb(xa+1)-tb(xa))*xb/msub color fr,fg,fb:boxf 2,130-x,20,130-x /* RGBの値の変化を表示 */ boxf x*4,140,x*4+3,150 color 255,100,100:boxf x*4,450-fr,x*4+3,450-fr color 100,255,100:boxf x*4,450-fg,x*4+3,450-fg color 100,100,255:boxf x*4,450-fb,x*4+3,450-fb next stop
配列代入や余りをもとめる演算子に気をつければ、RGBの値を求めるところまでなら
他の言語に持っていくのも難しくないと思います。
なるほどそう来ましたか
殆ど同じ感じになりますね
とりあえず、これでやってみます。
HSPは始めて習得した言語ですが最近は使わなかったのでちょっと懐かしいです。
Ver3まで来たんですね。進化しすぎててびっくりしました。
-----
まだまだ他の実現方法の投稿をお待ちしてます。
動かしてみました、綺麗なグラデーションが出ましたが
画像と比べてみると微妙に違いますね
うーん