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