2012.01.07 | mucho
This movie requires Flash Player 9
今回はいまさら感たっぷりな話です。おとなしくFROCESSING使えよって話です。
そんな話なんですが、こんばんはmuchoです。
RGBを個別に設定したり、16進数で設定したり、
その逆がしたかったりしたのでColorクラスなんぞ作ってみました。
欲を出してついでにHSVで設定したり、
その逆も出来るようにしてみようとしたら
ちょっとはまりました。
はまったのはHSVからRGBに変換するところです。
ちょちょっとググったところソースが見つかったんですが、
それだと微妙にうまく動かずいろんなソースを見比べたり。
その結果こんな感じになりました。
// RGBからHSVへ
private function fromRGB():void
{
var max:int = Math.max(Math.max(_red, _green), _blue);
var min:int = Math.min(Math.min(_red, _green), _blue);
var dif:int = max - min;
if ( max == 0 ) {
//_hue = 0;
//_saturation = 0;
_brightness = 0;
}else if (dif == 0) {
_saturation = 0;
_brightness = max / 255;
} else {
if ( _red >= _green && _red > _blue ) {
_hue = 60.0 * (_green - _blue) / dif;
} else if ( _green >= _blue && _green > _red ) {
_hue = 60.0 * (_blue - _red) / dif + 120.0;
} else if ( _blue >= _red && b > _green ) {
_hue = 60.0 * (_red - _green) / dif + 240.0;
}
if ( _hue < 0.0 ) _hue += _H_MAX;
_hue = _hue % _H_MAX;
_saturation = dif / max;
_brightness = max / 255;
}
}
// HSVからRGBへ
private function fromHSV():void
{
if (_saturation==0) {
_red = _green = _blue = int(_brightness * _ARGB_MAX);
}else {
var hi:int = int(_hue / (_H_MAX / 6));
var f:Number = _hue / (_H_MAX / 6) - hi;
var v:Number = _brightness;
var p:Number = v * ( 1 - _saturation );
var q:Number = v * ( 1 - _saturation * f);
var t:Number = v * ( 1 - _saturation * ( 1 - f));
var r:Number;
var g:Number;
var b:Number;
switch (hi) {
case 0 :
r = v;
g = t;
b = p;
break;
case 1 :
r = q;
g = v;
b = p;
break;
case 2 :
r = p;
g = v;
b = t;
break;
case 3 :
r = p;
g = q;
b = v;
break;
case 4 :
r = t;
g = p;
b = v;
break;
case 5 :
r = v;
g = p;
b = q;
break;
}
_red = int(r * _ARGB_MAX);
_green = int(g * _ARGB_MAX);
_blue = int(b * _ARGB_MAX);
}
}
そんなはまりを乗り越えてColorクラスなんてものを作ってみました。
以下のプロパティを持つオブジェクトです。
a(0~1),r(0~1),g(0~1),b(0~1)
h(0~360),s(0~1),v(0~1)
argb(0xfffffff)
rgb(0xfffff)
何かの参考になれば。
zip:Color.as

