[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以上の部分)は そのまま徐々に暗くなっていっているのがわかります。 これは線形変換であるからです。


では次回は、この座標によるカラー変化を使い本格的にグラデーションをかけてみます。

戻る