[PR]今日のニュースは
「Infoseek モバイル」
中間色の作成
最初は小学校の算数の問題から・・・
質問:20と30の真ん中の数字は何ですか?
答え:25
では、どうやってこの数字を見つけましたか?
たぶん、ほとんどの人が(20+30)/2を計算したんだと思います。
それ以外にも、30-20=10だから2つの数字の差は10。それで、20+10/2=25とか
計算した人もいるかもしれません。
いずれにせよ中間の値は25です(一次関数的な変化の場合)。
これは、色の計算をするときも同じです。
「R」の色と255の色の中間を求めるには(R+255)/2を計算します。
ためしに以下のプログラムを書いて見ましょう。
---Initialize---
coord=0;
---Transform---
R=(R+255)/2;
G=(G+255)/2;
B=(B+255)/2;
全ての色を255との中間値に変えています。

これで各座標の値が白(R,G,B)=(255,255,255)との中間値になります。
つまり白っぽくなります。
何度もこのフィルターをかければ、徐々に白に近づいていきます。
(ホワイトアウト)
この値をほかのカラーに変えれば、その色との中間値を計算できます。
では少し難しくなります。
質問:20と30を10:90に分ける点はどこですか?
答え:21
直感ですか?
計算式で(20*90+30*10)/(10+90)と計算しましたか?
すごくひねくれているなら、25を中心にとって、x(p)=25+5pと表してから、
-1から1まで5*f(x(p))関数を積分して、x(q)=20(1-q)/2+30(1+q)/2として、
x(-0.8)を計算した人もいますか?Gauss-Legendre法についてはここでは(たぶん)
扱いませんので各自勉強してください。扱うとしても周期関を使った画像変形
のところです。
ここでは(20*90+30*10)/(10+90)の計算式を使い、R,G,Bそれぞれの色と255の色
の10:90の色を計算してみます。
(色の割合的には90:10になります)
---Initialize---
coord=0;
---Transform---
R=(R*90+255*10)/100;
G=(G*90+255*10)/100;
B=(B*90+255*10)/100;

ほんのちょっとだけ白っぽく出来ました。
では、90の値をX座標の値にしてみます。
10の値は分母が一定になるように、(100-x)としてみます。
つまり、x=0 のときは100%白で、x=100 で100%元の色になると
いうわけです。
---Initialize---
coord=0;
cx=cy=0;
---Transform---
R=(R*x+255*(100-x))/100;
G=(G*x+255*(100-x))/100;
B=(B*x+255*(100-x))/100;

きれいにグラデーションがかかりました。
cx=cy=0;の行は、座標計算の前に左上を原点にするという式です。
(それでないと画像の中心が原点なのでxがマイナスから始まってしまう)
Xのドット数が100以上あるので、画像の右の部分(xが100以上の部分)は
そのまま徐々に暗くなっていっているのがわかります。
これは線形変換であるからです。
では次回は、この座標によるカラー変化を使い本格的にグラデーションをかけてみます。
戻る