2012.01.07 | 

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