我正在尝试创建一个将浮点值转换为颜色的函数。我创建了一个简单的线性比例尺:

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术语的典型含义。)

因此,对于您来说,startend将是两种颜色,而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,返回值就越接近endnormalizedValue越接近0,则返回值越接近start

对于其他插值函数,不一定是正确的。您可以将线性插值视为连接值的简单线段。是否希望在这些细分市场之间找到中间价?使用.5的标准化值,中提琴!

其他功能可能会有更陡的斜率,甚至在startend之间振荡!

尝试停止对颜色的思考,然后开始更抽象地思考。颜色相距一定距离。插值可帮助您定义哪些值位于它们之间的距离中。

07-24 15:45