java:表示色标上的浮点值范围

java:表示色标上的浮点值范围,java,colors,scale,Java,Colors,Scale,我试图创建一个函数,将浮点值转换为颜色。我创建了一个简单的线性比例: float value; float maxValue; float scaleStep = maxValue / 5; if (value < scaleStep) { color = blue } if (value > scaleStep && value <= scaleStep * 2) { color = green } if (value > sca

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

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
}
浮点值;
浮点最大值;
浮点数=最大值/5;
如果(值如果(value>scaleStep&&value scaleStep*2&&value scaleStep*3&&value scaleStep*4&&value我建议使用对数刻度。如果使用以10为基数的日志,范围将从-39到+39。

我建议使用对数刻度。如果使用以10为基数的日志,范围将从-39到+39。

这是您想要的。插值生成样本b在数据集中的已知样本之间

在这里,您已知的样本是您的颜色;蓝色、绿色、黄色、橙色和红色。这些已知颜色之间的颜色就是您要寻找的颜色

一个很好的插值函数可视化工具

为了您的方便,这里有一些插值函数。使用它们,找到最适合您的插值函数

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之间的任何值。这就是术语
normalized
的典型含义。)

因此,对于您来说,
start
end
将是两种颜色,
normalizedValue
将表示您离开始或结束颜色有多近

以线性插值为例

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,viola

其他函数可能有更陡的斜率,甚至在
start
end
之间振荡

试着停止用颜色来思考,开始更抽象地思考。颜色之间有一定的距离。插值可以帮助您定义它们之间的距离中的值。

就是您想要的。插值在数据集中的已知样本之间生成样本

在这里,您已知的样本是您的颜色;蓝色、绿色、黄色、橙色和红色。这些已知颜色之间的颜色就是您要寻找的颜色

一个很好的插值函数可视化工具

为了您的方便,这里有一些插值函数。使用它们,找到最适合您的插值函数

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之间的任何值。这就是术语
normalized
的典型含义。)

因此,对于您来说,
start
end
将是两种颜色,
normalizedValue
将表示您离开始或结束颜色有多近

以线性插值为例

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,viola

其他函数可能有更陡的斜率,甚至在
start
end
之间振荡


尝试停止用颜色来思考,开始更抽象地思考。颜色之间有一定的距离。插值可以帮助您定义它们之间的距离中的值。

由于浮点值在一个集合中,因此您知道有多少个,并可以计算颜色间隔。然后您可以对它们进行迭代,分配颜色并按颜色间隔递增


编辑:这种方法的缺点是,当值的数量发生变化时,相同的浮点值不会映射到相同的颜色。

由于浮点值在一个集合中,您知道有多少个,并且可以计算颜色间隔。然后您可以对它们进行迭代,分配颜色并按颜色间隔递增


编辑:这种方法的缺点是,当值的数量发生变化时,相同的浮点值不会映射到相同的颜色。

根据您的分布情况,双对数或三对数可能更好。我做了一个非常快速的测试,对于示例
{1.00,1.20,1.10,1.05,1.15,9.70,1.20,2.00,1.01,1.03,1.16,1.02,9.00,1.20,1.10,1.50,1.05,1.15,2.00,3.00}
,函数

int f(float x) {
    return (int)(Math.log(Math.log(x)*100+1)*2.5) ;
}
生成以下分发:

f(x)  color   count
 0    blue      4
 1    green     4
 2    yellow    6
 3    orange    3
 4    red       3

5分钟的工作还不错。但是,如果你发布了一个合理的数字样本(比如100),一个分布图,或者更好的是,一个分布直方图,我们可以更好地帮助您。诀窍是找到数据的分布函数。从该函数很容易得到第二个函数,使分布均匀(“平坦”).

根据您的分布情况,双对数或三对数可能更好。我做了一个非常快速的测试,对于示例
{1.00、1.20、1.10、1.05、1.15、9.70、1.20、2.00、1.01、1.03、1.16、1.02、9.00、1.20、1.10、1.50、1.05、1.15、2.00、3.00}
,函数

int f(float x) {
    return (int)(Math.log(Math.log(x)*100+1)*2.5) ;
}
生成以下分发:

f(x)  color   count
 0    blue      4
 1    green     4
 2    yellow    6
 3    orange    3
 4    red       3
5分钟的工作还不错。但是,如果你发布一个合理的数字样本(比如100),一个分布图,或者更好的是,一个分布直方图,我们可以帮助你做得更好。诀窍是找到数据的分布函数。从这个函数很容易得到第二个fu