通过算法显示颜色而不是硬定义值

时间:2011-01-05 11:24:29

标签: algorithm colors range

鉴于ms中的ping,有没有办法以算法方式计算着色,我们可以在没有硬编码ifs和颜色的情况下进行ping操作? 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 个答案:

答案 0 :(得分:2)

颜色是一个多维空间,因此您必须选择插值的方式。不寻常的只是用RGB绘制“直线”的尺寸并不是很好。

一种简单的方法是使用HSB/V/L color space。许多现代编程语言会自动转换为这个空间,例如参见[java Color methods] [2]。否则数学不是太难。 wikipedia article explains it

我遇到的情况并没有达到我想要的效果 - 例如我想要一种交通灯样式“通过琥珀从红色变为绿色”。在这种情况下,我使用了以下代码,这是“足够好”。如您所见,我利用了解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,float,float)