当前位置:  开发笔记 > 编程语言 > 正文

色彩缩放功能

如何解决《色彩缩放功能》经验,为你挑选了3个好方法。

我试图在表单上可视化一些值.它们的范围从0到200,我希望0左右的那些是绿色,当它们变为200时变为亮红色.

基本上该功能应根据输入的值返回颜色.有任何想法吗 ?



1> tzot..:

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

function transition(value, maximum, start_point, end_point):
    return start_point + (end_point - start_point)*value/maximum

给定的,您定义了一个为三元组(RGB,HSV等)进行转换的函数.

function transition3(value, maximum, (s1, s2, s3), (e1, e2, e3)):
    r1= transition(value, maximum, s1, e1)
    r2= transition(value, maximum, s2, e2)
    r3= transition(value, maximum, s3, e3)
    return (r1, r2, r3)

假设你有se三元组的RGB颜色,你可以按原样使用transition3功能.但是,通过HSV颜色空间会产生更多"自然"过渡.所以,鉴于转换函数(从Python colorsys模块无耻地窃取并转换为伪代码:):

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))



三元组的RGB颜色,你可以按原样使用transition3功能.但是,通过HSV颜色空间会产生更多"自然"过渡.所以,鉴于转换函数(从Python colorsys模块无耻地窃取并转换为伪代码:):
+1,你的`transition`函数的一个更好的名字是'lerp`,因为你在数学上正在做什么:http://en.wikipedia.org/wiki/Lerp_ (computing)

2> Peter Parker..:
red = (float)val / 200 * 255;

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

blue = 0;

return red << 16 + green << 8 + blue;



3> eaolson..:

你没有说你在做什么环境.如果你可以使用HSV颜色,通过设置S = 100和V = 100,并通过以下方式确定H,这很容易做到:

H = 0.4 * value + 120

从HSV转换为RGB也相当容易.

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

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有