История изменений
Исправление Stanson, (текущая версия) :
# utility routine for HLStoRGB
sub HueToRGB(@)
{
my $n1 = shift;
my $n2 = shift;
my $hue = shift;
# range check: note values passed add/subtract thirds of range
if( $hue < 0 ) { $hue += 255; }
if( $hue > 255 ) { $hue -= 255; }
# return r,g, or b value from this tridrant
if ( $hue < 43 ) { return ( $n1 + ( ( ( $n2 - $n1 ) * $hue + 21 ) / 43 ) ); }
if ( $hue < 128 ) { return ( $n2 ); }
if ( $hue < 170 ) { return ( $n1 + ( ( ( $n2 - $n1 ) * ( 170 - $hue) + 21 ) / 43 ) ); }
return ( $n1 );
}
sub HLStoRGB(@)
{
my $hue = shift;
my $lum = shift;
my $sat = shift;
my $R; # RGB component values
my $G;
my $B;
my $M1; # calculated magic numbers (really!)
my $M2;
if( $hue > 255 ) { $hue = 255; }
if( $hue < 0 ) { $hue = 0; }
if( $sat == 0 )
{ # achromatic case
$R = $G = $B = $lum;
}
else
{ # chromatic case
# set up magic numbers
if( $lum <= 128) { $M2 = ( $lum * (255 + $sat) + 128) / 255; }
else { $M2 = $lum + $sat - ( ( $lum * $sat ) + 128 ) / 255; }
$M1 = 2 * $lum - $M2;
# get RGB, change units from HLSMAX to RGBMAX
$R = ( HueToRGB( $M1, $M2, $hue + 85 ) * 255 + 128 ) / 255;
$G = ( HueToRGB( $M1, $M2, $hue ) * 255 + 128 ) / 255;
$B = ( HueToRGB( $M1, $M2, $hue - 85 ) * 255 + 128 ) / 255;
}
return sprintf( "#%02X%02X%02X", $R, $G, $B );
}
Собственно тебе нужно только H из HLS, соответственно
web_color=HLStoRGB( x, 128, 256);
Следует заметить, что Hue начинается с красного, проходит все цвета радуги до фиолетового и заканчивается опять же красным. Ибо это типа круг. Так что если надо от красного к синему, то диапазон надо урезать будет, на твой вкус.
ЗЫ: Код не мой, я только разместил объяву.
Исходная версия Stanson, :
# utility routine for HLStoRGB
sub HueToRGB(@)
{
my $n1 = shift;
my $n2 = shift;
my $hue = shift;
# range check: note values passed add/subtract thirds of range
if( $hue < 0 ) { $hue += 255; }
if( $hue > 255 ) { $hue -= 255; }
# return r,g, or b value from this tridrant
if ( $hue < 43 ) { return ( $n1 + ( ( ( $n2 - $n1 ) * $hue + 21 ) / 43 ) ); }
if ( $hue < 128 ) { return ( $n2 ); }
if ( $hue < 170 ) { return ( $n1 + ( ( ( $n2 - $n1 ) * ( 170 - $hue) + 21 ) / 43 ) ); }
return ( $n1 );
}
sub HLStoRGB(@)
{
my $hue = shift;
my $lum = shift;
my $sat = shift;
my $R; # RGB component values
my $G;
my $B;
my $M1; # calculated magic numbers (really!)
my $M2;
if( $hue > 255 ) { $hue = 255; }
if( $hue < 0 ) { $hue = 0; }
if( $sat == 0 )
{ # achromatic case
$R = $G = $B = $lum;
}
else
{ # chromatic case
# set up magic numbers
if( $lum <= 128) { $M2 = ( $lum * (255 + $sat) + 128) / 255; }
else { $M2 = $lum + $sat - ( ( $lum * $sat ) + 128 ) / 255; }
$M1 = 2 * $lum - $M2;
# get RGB, change units from HLSMAX to RGBMAX
$R = ( HueToRGB( $M1, $M2, $hue + 85 ) * 255 + 128 ) / 255;
$G = ( HueToRGB( $M1, $M2, $hue ) * 255 + 128 ) / 255;
$B = ( HueToRGB( $M1, $M2, $hue - 85 ) * 255 + 128 ) / 255;
}
return sprintf( "#%02X%02X%02X", $R, $G, $B );
}
Собственно тебе нужно только H из HLS, соответственно
web_color=HLStoRGB( x, 128, 256);
Следует заметить, что Hue начинается с красного, проходит все цвета радуги до фиолетового и заканчивается опять же красным. Ибо это типа круг. Так что если надо от красного к синему, то диапазон надо урезать будет, на твой вкус.