Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Colors 颜色缩放函数_Colors_Interpolation - Fatal编程技术网

Colors 颜色缩放函数

Colors 颜色缩放函数,colors,interpolation,Colors,Interpolation,我试图在表单上可视化一些值。它们的范围从0到200,我希望0周围的是绿色,当它们到200时变成鲜红色 基本上,函数应该根据输入的值返回颜色。有什么想法吗?red=(float)val/200*255; red = (float)val / 200 * 255; green = (float)(200 - val) / 200 * 255; blue = 0; return red << 16 + green << 8 + blue; 绿色=(浮动)(200-val

我试图在表单上可视化一些值。它们的范围从0到200,我希望0周围的是绿色,当它们到200时变成鲜红色

基本上,函数应该根据输入的值返回颜色。有什么想法吗?

red=(float)val/200*255;
red = (float)val / 200 * 255;

green = (float)(200 - val) / 200 * 255;

blue = 0;

return red << 16 + green << 8 + blue;
绿色=(浮动)(200-val)/200*255; 蓝色=0; return red查看我个人会选择一条穿过颜色空间的路径,并将值映射到该路径上


但这是一个直接的函数。我认为你可能更适合javascript颜色选择器,你可以找到一个快速的颜色,它会给你十六进制,你可以存储十六进制。

选择一个你喜欢的绿色(例如RGB1=#00FF00)和一个你喜欢的红色(例如RGB2=#FF0000),然后像这样计算颜色

R = R1 * (200-i)/200 + R2 * i/200
G = G1 * (200-i)/200 + G2 * i/200
B = B1 * (200-i)/200 + B2 * i/200

为了获得最佳可控和准确的效果,您应该使用HSV颜色空间。使用HSV,您可以轻松缩放彼此分离的色调、饱和度和/或亮度。然后,您将转换为RGB。

您不需要说明在什么环境下进行转换。如果您可以使用,通过设置S=100和V=100并通过以下方式确定H,这将非常容易:

H = 0.4 * value + 120
这也相当容易


[编辑]注意:与其他一些建议的解决方案相比,这将改变颜色绿色->黄色->橙色->红色。

基本上,两个值之间平滑过渡的一般方法是以下函数:

function transition(value, maximum, start_point, end_point):
    return start_point + (end_point - start_point)*value/maximum
在给定的情况下,您定义了一个函数,该函数对三元组(RGB、HSV等)进行转换

假设s和e三元组具有RGB颜色,则可以按原样使用transition3函数。然而,通过HSV颜色空间产生更多的“自然”过渡。因此,给定转换函数(不知羞耻地从Python colorsys模块中盗取并转换为伪代码:):


如果像Peter Parker建议的那样为红色和绿色值使用线性渐变,则值100的颜色基本上是(127,127,0)。理想情况下,您希望它在该中点为亮橙色或黄色。为此,您可以使用:

Red = max(value / 100, 1) * 255
Green = (1 - max(value / 100, 1)) * 255
Blue = 0

扩展@tzot的代码。。。您还可以在起点和终点之间设置一个中点,如果您想要“过渡颜色”,这将非常有用

//注释:s=start\u三元组,m=mid\u三元组,e=end\u三元组
函数转换3midpoint=(值、最大值、s、m、e):
mid=最大值/2
如果值<中间值
返回转换3(值、中间值、s、m)
其他的
返回转换3(值-中间、中间、m、e)

这将使中点(100)呈绿色:rgb(127,127,0)。你会希望你的中点是一个明亮的黄色或橙色。请看:我同意这一点,它看起来不好看,但是我是一名编码员,中点不是规范的一部分;)+1.我想问一个新问题,关于如何改进我在HTML/PHP中为条形图着色的颜色算法。。。因此,我提出了类似的问题,您的回答帮助我解决了这个问题,而不必问这个问题!谢谢+1,您的
转换
函数的更好名称应该是
lerp
,因为这在数学上就是您正在做的:
function rgb_to_hsv(r, g, b):
    maxc= max(r, g, b)
    minc= min(r, g, b)
    v= maxc
    if minc == maxc then return (0, 0, v)
    diff= maxc - minc
    s= diff / maxc
    rc= (maxc - r) / diff
    gc= (maxc - g) / diff
    bc= (maxc - b) / diff
    if r == maxc then
        h= bc - gc
    else if g == maxc then
        h= 2.0 + rc - bc
    else
        h = 4.0 + gc - rc
    h = (h / 6.0) % 1.0 //comment: this calculates only the fractional part of h/6
    return (h, s, v)

function hsv_to_rgb(h, s, v):
    if s == 0.0 then return (v, v, v)
    i= int(floor(h*6.0)) //comment: floor() should drop the fractional part
    f= (h*6.0) - i
    p= v*(1.0 - s)
    q= v*(1.0 - s*f)
    t= v*(1.0 - s*(1.0 - f))
    if i mod 6 == 0 then return v, t, p
    if i == 1 then return q, v, p
    if i == 2 then return p, v, t
    if i == 3 then return p, q, v
    if i == 4 then return t, p, v
    if i == 5 then return v, p, q
    //comment: 0 <= i <= 6, so we never come here
start_triplet= rgb_to_hsv(0, 255, 0) //comment: green converted to HSV
end_triplet= rgb_to_hsv(255, 0, 0) //comment: accordingly for red

maximum= 200

… //comment: value is defined somewhere here

rgb_triplet_to_display= hsv_to_rgb(transition3(value, maximum, start_triplet, end_triplet))
Red = max(value / 100, 1) * 255
Green = (1 - max(value / 100, 1)) * 255
Blue = 0
//comment: s = start_triplet, m = mid_triplet, e = end_triplet
function transition3midpoint = (value, maximum, s, m, e):
    mid = maximum / 2
    if value < mid
      return transition3(value, mid, s, m)
    else
      return transition3(value - mid, mid, m, e)