LINUX.ORG.RU

как из спектра цветов сформировать массив?

 


1

1

у меня вопрос без кода поэтому буду благодарен даже за теоретический ответ

есть вертикальная ось, в ней приблизительно 200000 значений. на эту ось будут нанесены цветные шарики. цвет шариков должен распределяться по спектру. для определённости, скажем, самый нижний шарик - синий, самый верхний - красный

у меня задача написать функцию, которая принимала бы значение по оси(одно из 200000), а возвращала бы код цвета. этот код может быть в формате rgb, rgbA, hex или в любом другом, понятном браузеру формате

пользоваться буду html/css/js

ps: админы, смотрю, у вас в автокомплите есть тег 'javasript'. без 'c'

Так придумай функцию для каждого из каналов.
Например, синий 255-X, красный X
Ну и масштабируй по количеству значений.

madcore ★★★★★ ()
# 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);
где x - приведённое к диапазону 0-255 твоё число для которого нужно вычислить цвет.

Следует заметить, что Hue начинается с красного, проходит все цвета радуги до фиолетового и заканчивается опять же красным. Ибо это типа круг. Так что если надо от красного к синему, то диапазон надо урезать будет, на твой вкус.

ЗЫ: Код не мой, я только разместил объяву.

Stanson ★★★★★ ()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от Stanson

в js нет функций для форматирования строк. ему придется делать что-то вроде:

((r & 255) << 16 | (g & 255) << 8 | b & 255).toString(16)
tz4678 ★★ ()
Ответ на: комментарий от ChALkeR

это помогло. в цикле менял первый аргумент, а второй и третий аргументы оставались постоянными

stanson чуть выше про тот же способ говорил

prozaik ()
Последнее исправление: prozaik (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.