/*
* Copyright 2007 Michiyasu Wada
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* com.seyself.math.ColorMath
*
* 色に関する計算もろもろ。
* static関数のみで構成されています。
*
* @author Michiyasu Wada
*/
class com.seyself.math.ColorMath
{
private function ColorMath(){}
/**
* 減算
* 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から減算した数値を返します。
* ARGBを示す数値を引数に渡した場合、アルファ値は無視されます。
*
* @param col1 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
* @param col2 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
* @return Number - 減算混色値
* @usage
* import com.seyself.math.ColorMath;
* trace( ColorMath.subtract( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : 656500
*
*/
static function subtract( col1:Number , col2:Number ):Number
{
var a = toRGB( col1 );
var b = toRGB( col2 );
var nr = Math.max( Math.max( b[0]-(256-a[0]) , a[0]-(256-b[0]) ) , 0 );
var ng = Math.max( Math.max( b[1]-(256-a[1]) , a[1]-(256-b[1]) ) , 0 );
var nb = Math.max( Math.max( b[2]-(256-a[2]) , a[2]-(256-b[2]) ) , 0 );
return toDec( nr , ng , nb );
}
/**
* 加法混色
* 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から加法混色した数値を返します。
* ARGBを示す数値を引数に渡した場合、アルファ値は無視されます。
*
* @param col1 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
* @param col2 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
* @return Number - 加法混色値
* @usage
* import com.seyself.math.ColorMath;
* trace( ColorMath.sum( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : ffff66
*
*/
static function sum( col1:Number , col2:Number ):Number
{
var a = toRGB( col1 );
var b = toRGB( col2 );
var nr = Math.min( a[0]+b[0] , 255 );
var ng = Math.min( a[1]+b[1] , 255 );
var nb = Math.min( a[2]+b[2] , 255 );
return toDec( nr , ng , nb );
}
/**
* 減法混色
* 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から減法混色した数値を返します。
* ARGBを示す数値を引数に渡した場合、アルファ値は無視されます。
*
* @param col1 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
* @param col2 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
* @return Number - 減法混色値
* @usage
* import com.seyself.math.ColorMath;
* trace( ColorMath.sub( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : 999900
*
*/
static function sub( col1:Number , col2:Number ):Number
{
var a = toRGB( col1 );
var b = toRGB( col2 );
var nr = Math.max( a[0]-b[0] , 0 );
var ng = Math.max( a[1]-b[1] , 0 );
var nb = Math.max( a[2]-b[2] , 0 );
return toDec( nr , ng , nb );
}
/**
* 比較(暗)
* 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から比較して、RGBそれぞれ数値の低い方を合わせた数値を返します。
* ARGBを示す数値を引数に渡した場合、アルファ値は無視されます。
*
* @param col1 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
* @param col2 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
* @return Number - 比較(暗)値
* @usage
* import com.seyself.math.ColorMath;
* trace( ColorMath.min( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : 666600
*
*/
static function min( col1:Number , col2:Number ):Number
{
var a = toRGB( col1 );
var b = toRGB( col2 );
var r = Math.min( a[0] , b[0] );
var g = Math.min( a[1] , b[1] );
var b = Math.min( a[2] , b[2] );
return toDec( r , g , b );
}
/**
* 比較(明)
* 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から比較して、RGBそれぞれ数値の高い方を合わせた数値を返します。
* ARGBを示す数値を引数に渡した場合、アルファ値は無視されます。
*
* @param col1 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
* @param col2 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
* @return Number - 比較(明)値
* @usage
* import com.seyself.math.ColorMath;
* trace( ColorMath.max( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : ffff66
*
*/
static function max( col1:Number , col2:Number ):Number
{
var a = toRGB( col1 );
var b = toRGB( col2 );
var r = Math.max( a[0] , b[0] );
var g = Math.max( a[1] , b[1] );
var b = Math.max( a[2] , b[2] );
return toDec( r , g , b );
}
/**
* ARGBを示す数値( 0x00000000 から 0xFFFFFFFF まで)、もしくはRGBを示す数値( 0x000000 から 0xFFFFFF まで)を
* Alpha, R, G, B それぞれ 0 から 255 までの数値に分割した配列を返します。
* 戻り値の配列に含まれる値は [ R , G , B , Alpha ] と Alpha値 が最後になっていることに注意してください。
*
* @param col : Number - ARGBを示す数値( 0x00000000 から 0xFFFFFFFF まで)
* @return Array - 各色の値を示す配列 [ R , G , B , Alpha ]
* @usage
* import com.seyself.math.ColorMath;
* trace( ColorMath.toRGB( 0xFF336699 ) ); // 出力 : 51,102,153,255
*
*/
public static function toRGB( col:Number ):Array
{
if(typeof(col)=="number"){
var a = Math.floor(col/16777216);
var r = Math.floor((col-a*16777216)/65536);
var g = Math.floor((col-(a*16777216+r*65536))/256);
var b = Math.floor((col-(a*16777216+r*65536+g*256)));
return [r,g,b,a];
}
}
/**
* 引数に R, G, B, Alpha を示す、それぞれ 0x00 から 0xFF までの数値を合算した数値を返します。
* Alpha値は省略が可能です。省略した場合は 0 として換算されます。
*
* @param r : Number - 赤(R)を示す数値( 0x00 から 0xFF まで)
* @param g : Number - 緑(G)を示す数値( 0x00 から 0xFF まで)
* @param b : Number - 青(B)を示す数値( 0x00 から 0xFF まで)
* @param a : Number - アルファ(A)を示す数値( 0x00 から 0xFF まで)
* @return Number - 各色の値から求められたARGBを示す数値
* @usage
* import com.seyself.math.ColorMath;
* trace( ColorMath.toDec( 51, 102 , 153, 255 ) ); // 出力 : 4281558681
*
*/
public static function toDec( r:Number , g:Number , b:Number , a:Number ):Number
{
if( a ) return Math.floor(a)*16777216+Math.floor(r)*65536+Math.floor(g)*256+Math.floor(b);
return Math.floor(r)*65536+Math.floor(g)*256+Math.floor(b);
}
/**
* RGBそれぞれの数値から、HSV(HSB) に換算した配列を返します。
* (表記上HSVとしていますが B が Blue と混同しないためにHSVを用いています。)
* RGB の値はそれぞれ以下の通りです。
* R - 0 から 255 までの数値
* G - 0 から 255 までの数値
* B - 0 から 255 までの数値
*
* HSV の値はそれぞれ以下の通りです。
* H - 0 から 360 までの数値
* S - 0 から 100 までの数値
* V - 0 から 100 までの数値
*
* アルファを含めた計算はできません。
*
* @param r : Number - 赤(R)を示す数値( 0x00 から 0xFF まで)
* @param g : Number - 緑(G)を示す数値( 0x00 から 0xFF まで)
* @param b : Number - 青(B)を示す数値( 0x00 から 0xFF まで)
* @return Array - HSVに変換した値 [ H, S, V ]
* @usage
* import com.seyself.math.ColorMath;
* var rgb = ColorMath.toRGB( 0xFF6600 );
* trace( ColorMath.convertHSV.apply( null , rgb ) ); // 出力 : 24,100,50
*
*/
public static function convertHSV( r:Number, g:Number, b:Number ):Array
{
r/=255; g/=255; b/=255;
var h=0, s=0, v=0;
var x, y;
if(r>=g) x=r; else x=g; if(b>x) x=b;
if(r<=g) y=r; else y=g; if(b
* import com.seyself.math.ColorMath;
* trace( ColorMath.convertRGB( 24, 100, 50 ) ); // 出力 : 255,102,0
*
*/
public static function convertRGB( h:Number, s:Number, v:Number ):Array
{
s=s/100, v=v/100;
var r=0, g=0, b=0;
var i, x, y, z;
if(s<0) s=0; if(s>1) s=1; if(v<0) v=0; if(v>1) v=1;
h=h%360; if(h<0) h+=360; h/=60;
i = Math.floor(h);
x=v*(1-s); y=v*(1-s*(h-i)); z=v*(1-s*(1-h+i));
switch(i){
case 0 : r=v; g=z; b=x; break;
case 1 : r=y; g=v; b=x; break;
case 2 : r=x; g=v; b=z; break;
case 3 : r=x; g=y; b=v; break;
case 4 : r=z; g=x; b=v; break;
case 5 : r=v; g=x; b=y; break;
}
return [ r*255, g*255, b*255 ];
}
}