我正在写一个 Java 游戏,我想实现一个功率计,你将如何努力拍摄的东西。
我需要写一个函数,它需要一个介于 0-100 之间的 int,并且根据这个数字有多高,它将返回绿色(功率标度上的 0)和红色(功率标度上的 100)之间的颜色。
Similar to how volume controls work:
我需要对颜色的红色,绿色和蓝色组件执行什么操作才能生成绿色和红色之间的颜色?
所以,我可以运行说,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);
}
其中“power”是 0.0 到 1.0 之间的数字。0.0 将返回鲜红色,1.0 将返回鲜绿色。
Java Hue Chart:
这应该可以工作-只需线性缩放红色和绿色值即可。假设您的最大红色 / 绿色 / 蓝色值为255
,并且n
在0 .. 100
范围内
R = (255 * n) / 100
G = (255 * (100 - n)) / 100
B = 0
(针对整数数学进行了修订,对 Ferrucio 表示敬意)
另一种方法是使用HSV colour model,并以适合您的任何饱和度和值将色调从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 范围。
简短复制 `n` 粘贴答案...
在 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 = "<li style='background-color:" + percentToRGB(i) + "'>" + i + "</li>";
$("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;
}
<script src="https://ajax.googlea.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<ul></ul>
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(30条)