package VFCommon
{
public class Utility
{
public static var STANDARD_L:Number = 0.5;
public static function RoundAngle(angle:Number):Number
{
if (angle >= Math.PI * 2)
return angle % Math.PI * 2;
if (angle < 0)
return Math.PI * 2 + angle % Math.PI * 2;
return angle;
}
public static function GetBright(color:int):int // for HSV
{
var min:Number = 0;
var max:Number = 0;
var v:Number = 0;
// blue
v = color & 0x0000ff;
min = v;
max = v;
// green
v = (color & 0x00ff00) >> 8;
if (v > max)
max = v;
if (v < min)
min = v;
// red
v = (color & 0xff0000) >> 16;
if (v > max)
max = v;
if (v < min)
min = v;
// return
return (min + max) / 2;
}
/*******************************************************/
public static function GetRightFontColor(rgb_color:uint):uint{
var L:Number = RGB2HSL(rgb_color);
if(L >= STANDARD_L){
return 0x000000;
}else{
return 0xffffff;
}
}
public static function RGB2HSL(rgb_color:uint):Number{
var R:Number = GetRValue(rgb_color)/255.0;
var G:Number = GetGValue(rgb_color)/255.0;
var B:Number = GetBValue(rgb_color)/255.0;
var cmax:Number = Math.max(R,Math.max(G,B));
var cmin:Number = Math.min(R,Math.min(G,B));
var L:Number = (cmax+cmin)/2.0;
return L;
}
public static function GetRValue(color:uint):Number{
var r:Number = color >> 16 & 0xff;
trace(r);
return r;
}
public static function GetGValue(color:uint):Number{
var g:Number = color >> 8 & 0xff;
trace(g);
return g;
}
public static function GetBValue(color:uint):Number{
var b:Number = color & 0xff;
trace(b);
return b;
}
/*******************************************************/
}
}
算法:
void RGBtoHSL(COLORREF rgb, double* H, double* S, double* L)
{
double delta;
double r = (double)GetRValue(rgb)/255;
double g = (double)GetGValue(rgb)/255;
double b = (double)GetBValue(rgb)/255;
double cmax = max(r,max(g,b));
double cmin = min(r,min(g,b));
*L = (cmax+cmin)/2.0;
if (cmax == cmin)
{
*S = 0;
*H = 0; // it's really undefined
}
else
{
if (*L < 0.5)
*S = (cmax-cmin)/(cmax+cmin);
else
*S = (cmax-cmin)/(2.0-cmax-cmin);
delta = cmax - cmin;
if (r==cmax)
*H = (g-b)/delta;
else if (g==cmax)
*H = 2.0 +(b-r)/delta;
else
*H = 4.0+(r-g)/delta;
*H /= 6.0;
if (*H < 0.0)
*H += 1;
}
}
COLORREF HLStoRGB(const double& H, const double& L, const double& S)
{
double r,g,b;
double m1, m2;
if (S==0)
{
r=g=b=L;
}
else
{
if (L <= 0.5)
m2 = L*(1.0+S);
else
m2 = L+S-L*S;
m1 = 2.0*L-m2;
r = HuetoRGB(m1, m2, H+1.0/3.0);
g = HuetoRGB(m1, m2, H);
b = HuetoRGB(m1, m2, H-1.0/3.0);
}
return RGB((BYTE)(r*255),(BYTE)(g*255),(BYTE)(b*255));
}