插值是你想要的。插值在数据集中的已知样本之间生成样本。
在这里,您已知的样本就是您的颜色;蓝色、绿色、黄色、橙色和红色。这些已知颜色之间的颜色就是您要寻找的颜色。
这是一个很好的插值函数可视化器的链接。
为了您的方便,这里有一些插值函数。和他们一起玩,找到最适合你的!
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
。
对于其他插值函数,这不一定是正确的。您可以将线性插值视为连接值的简单线段。想要介于这些细分市场之间的价值吗?使用归一化值 0.5,中提琴!
其他函数可能有更陡峭的斜率,甚至在start
和之间振荡end
!
试着停止思考颜色,开始更抽象地思考。颜色相距一定距离。插值可帮助您定义它们之间的距离中的值。