我正在尝试创建一个将浮点值转换为颜色的函数。我创建了一个简单的线性比例尺:
float value;
float maxValue;
float scaleStep = maxValue / 5;
if (value < scaleStep) {
color = blue
}
if (value > scaleStep && value <= scaleStep * 2) {
color = green
}
if (value > scaleStep * 2 && value <= scaleStep * 3) {
color = yellow
}
if (value > scaleStep * 3 && value <= scaleStep * 4) {
color = orange
}
if (value > scaleStep * 4 && value <= scaleStep * 5) {
color = red
}
但是由于我要表示的集合中的大多数(但不是全部)值都与一个特定值非常接近,因此使用线性比例的图形表示不是很有用(几乎所有内容都转换为一种颜色)。
如何创建非线性比例,以便值之间的差异更明显?
最佳答案
Interpolation是您想要的。插值会在数据集中的已知样本之间生成样本。
在这里,您已知的样本就是您的颜色;蓝色,绿色,黄色,橙色和红色。这些已知颜色之间的颜色是您要寻找的。
Here's a link可以很好地显示插值函数。
为了方便起见,这里有一些插值功能。与他们一起玩,找到最适合您的游戏!
public float linearInterpolation(float start, float end, float normalizedValue) {
return start + (end - start) * normalizedValue;
}
public float sinInterpolation(float start, float end, float normalizedValue){
return (start+(end-start)* (1 - Math.cos(normalizedValue * Math.PI)) / 2;
}
//usage
linearInterpolation(red, green, .5f);//halfway between red and green.
//same with other demonstrations.
编辑:
在此,开始和结束是指开始和结束样本。 normalizedValue是介于[0,1]之间(包括0和1)的某个值(这意味着它可以正好等于0或1,或者介于0和1之间的任何值。这就是
normalized
术语的典型含义。)因此,对于您来说,
start
和end
将是两种颜色,而normalizedValue
将代表您与起始或结束颜色的距离。以linearInterpolation为例。
red = 1;
green = 2;
float midway = 1 + (2 - 1) * .5;
//midway = 1.5, which is halfway between red and green.
float allRed = 1 + (2 - 1) * 0;
//allRed = 1, which is the value of red (or start)
float allGreen = 1 + (2 - 1) * 1;
//allGreen = 2, which is the value of green (or end)
因此,对于线性插值,
normalizedValue
越接近1,返回值就越接近end
。 normalizedValue
越接近0,则返回值越接近start
。对于其他插值函数,不一定是正确的。您可以将线性插值视为连接值的简单线段。是否希望在这些细分市场之间找到中间价?使用.5的标准化值,中提琴!
其他功能可能会有更陡的斜率,甚至在
start
和end
之间振荡!尝试停止对颜色的思考,然后开始更抽象地思考。颜色相距一定距离。插值可帮助您定义哪些值位于它们之间的距离中。