Отображать цвета алгоритмически вместо жестко определяемых значений - PullRequest
1 голос
/ 05 января 2011

Учитывая пинг в мс, есть ли какой-нибудь способ алгоритмической обработки затенения, который мы можем сделать этот пинг без жесткого кодирования if и цветов? IE эта функция работает хорошо:

function displayPing(lngThePingTime)

    response.Write("<span style=""font-wight:bold;color:")  

    if(lngThePingTime < 50) then
        response.Write("#77ff66")
    elseif lngThePingTime < 100 then
        response.Write("#22ee00")
    elseif lngThePingTime < 150 then
        response.Write("#33bb00")
    elseif lngThePingTime < 250 then
        response.Write("#ffaa00")
    elseif lngThePingTime < 400 then
        response.Write("#ee6600")
    elseif lngThePingTime < 550 then
        response.Write("#dd4400")
    elseif lngThePingTime < 700 then
        response.Write("#dd1100")
    elseif lngThePingTime < 1000 then
        response.Write("#990000")
    else
        response.Write("#660000")
    end if

    response.Write(""">")    
    response.Write lngThePingTime        
    response.Write("</span>")

end function

Но есть ли способ иметь алгоритм, который говорит:

Lowest Colour : #77ff66
Highest Colour: #660000
Cutoff Value: 1500 (any ping higher than this is fixed to highest colour)

Так что цвет будет каждого оттенка, а не набор фиксированных оттенков?

Язык не имеет значения, больше интересует метод!

1 Ответ

2 голосов
/ 05 января 2011

Цвета - это многомерное пространство, поэтому вы должны выбрать способ интерполяции. Необычно просто нарисовать «прямую» линию с RGB, поскольку размеры не очень хорошо работают.

Один простой способ - использовать HSB / V / L цветовое пространство . Многие современные языки программирования автоматически преобразуются в это пространство, например, см. [Методы java Color] [2]. В противном случае математика не так уж сложна. Статья в Википедии объясняет это .

У меня была ситуация, когда это делало не то, что я хотел - например, я хотел стиль светофора "переходить от красного к зеленому через янтарь". В этом случае я использовал следующий код, который был «достаточно хорош». Как вы можете видеть, я немного узнал об отношениях между RGB и цветом. Это не так настраиваемо, как вы могли бы хотеть, но дает пример метода, который вы могли бы использовать:

private static int makeTrafficLight(float fraction, int brightness) {
    final float orange = 0.4f;
    if(fraction < orange) {
            int r = brightness;
            float f = fraction/orange;
            int g = (int)(brightness*(f/2.0f));
            int b = 0;
            return Color.rgb(r,g,b);
    } else {
            float f = ((fraction-orange)/(1.0f-orange));
            int r = (int)(brightness*(1.0f-f));
            int g = (int)(brightness*(f/2.0f+0.5f));
            int b = 0;
            return Color.rgb(r,g,b);
    }
}

[2]: http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Color.html#HSBtoRGB(float, плавать, плавать)

...