我正在写一个Java游戏,我想要实现一个功率计,你会有多难拍摄一些东西.
我需要编写一个在0到100之间取一个int的函数,根据该数字的高度,它将返回Green(功率刻度为0)和Red(功率刻度为100)之间的颜色.
与音量控制的工作方式类似:
我需要对颜色的红色,绿色和蓝色组件进行哪些操作才能生成绿色和红色之间的颜色?
所以,我可以说,getColor(80)
它将返回一个橙色(它的值在R,G,B)或getColor(10)
将返回更多的绿色/黄色RGB值.
我知道我需要为新颜色增加R,G,B值的分量,但我不知道颜色从绿色 - 红色偏移时的上升或下降.
进展:
我最终使用了HSV/HSB色彩空间,因为我更喜欢渐变色(中间没有深褐色).
我使用的功能是:
public Color getColor(double power)
{
double H = power * 0.4; // Hue (note 0.4 = Green, see huge chart below)
double S = 0.9; // Saturation
double B = 0.9; // Brightness
return Color.getHSBColor((float)H, (float)S, (float)B);
}
其中"功率"是介于0.0和1.0之间的数字.0.0将返回亮红色,1.0将返回亮绿色.
Java Hue图表:
这应该工作 - 只是线性缩放红色和绿色值.假设您的最大红/绿/蓝值是255
,并且n
在范围内0 .. 100
R = (255 * n) / 100 G = (255 * (100 - n)) / 100 B = 0
(修改为整数数学,给Ferrucio一顶帽子)
另一种方法是使用HSV颜色模型,并将色调从0 degrees
(红色)循环到120 degrees
(绿色),无论您的饱和度和值如何.这应该会给出更令人愉悦的渐变.
以下是每种技术的演示 - 顶部渐变使用RGB,底部使用HSV:
在我的脑海中,这是HSV空间中的绿 - 红色调过渡,转换为RGB:
blue = 0.0 if 0<=power<0.5: #first, green stays at 100%, red raises to 100% green = 1.0 red = 2 * power if 0.5<=power<=1: #then red stays at 100%, green decays red = 1.0 green = 1.0 - 2 * (power-0.5)
上例中的红色,绿色,蓝色值是百分比,您可能希望将它们乘以255以获得最常用的0-255范围.
Short Copy'n'Paste答案......
在Java Std上:
int getTrafficlightColor(double value){
return java.awt.Color.HSBtoRGB((float)value/3f, 1f, 1f);
}
在Android上:
int getTrafficlightColor(double value){
return android.graphics.Color.HSVToColor(new float[]{(float)value*120f,1f,1f});
}
注意:value是0到1之间的数字,表示红色到绿色的条件.
如果你想要一个绿色 - 黄色 - 红色表示,如接受的答案建议,那么看看这个.
http://jsfiddle.net/0awncw5u/2/
function percentToRGB(percent) {
if (percent === 100) {
percent = 99
}
var r, g, b;
if (percent < 50) {
// green to yellow
r = Math.floor(255 * (percent / 50));
g = 255;
} else {
// yellow to red
r = 255;
g = Math.floor(255 * ((50 - percent % 50) / 50));
}
b = 0;
return "rgb(" + r + "," + g + "," + b + ")";
}
function render(i) {
var item = "" + i + " ";
$("ul").append(item);
}
function repeat(fn, times) {
for (var i = 0; i < times; i++) fn(i);
}
repeat(render, 100);
li {
font-size:8px;
height:10px;
}
绿色和红色之间的线性插值几乎应该起作用,除了在中间会有泥褐色.
最灵活,最佳的解决方案是在某处具有您想要的精确颜色渐变的图像文件.然后在那里查找像素值.这具有灵活性,您可以调整渐变恰到好处.
如果你仍然想从代码中做到这一点,那么最好在左侧的绿色和黄色之间插入,在右侧的黄色和红色之间进行插值.在RGB空间中,绿色是(R = 0,G = 255,B = 0),黄色是(R = 255,G = 255,B = 0),红色是(R = 255,G = 0,B = 0) ) - 这假设每个颜色分量从0到255.