假设我有一个带有构造函数RainbowColorsMapper(int n)
的RainbowColorsMapper类,其中n> = 2。现在,我想使用mapper.getColor(int number)
方法获得从红色到紫罗兰色的彩虹色的连续映射,其中低值对应于红色端,高值接近n到紫罗兰色端。如果n = 2,则mapper.getColor(0)
返回光谱的最左颜色(近红色),而mapper.getColor(1)
返回光谱的最右颜色。与较大的n相同,具有自动缩放比例。
我的问题:这样做相对容易吗?如果是,对算法有何建议?
最简单的方法是在HSL colourspace中工作,而不是RGB。创建饱和度和亮度固定的颜色(我建议为100%和50%),并且色相在合适的端点之间有所不同(您可能需要进行实验才能找到)。使用Color.getHSBColor将HSL值转换为RGB。
[请记住,彩虹的颜色是根据波长排序的,所以基本上在您的模型中,n
与波长有关。因此,您的问题本质上可以归结为将波长(n
)映射到RGB。这不是一个完全琐碎的过程,但是首先,您可以检查出这个问题:
或使用“色相饱和度值”颜色模型,并在色相上进行迭代。
您基本上在颜色模型中将色调从0更改为300
HSL Color使您可以轻松进行此操作。
private int r = 255;
private int g = 0;
private int b = 0;
private void nextRGB() {
if (r == 255 && g < 255 && b == 0) {
g++;
}
if (g == 255 && r > 0 && b == 0) {
r--;
}
if (g == 255 && b < 255 && r == 0) {
b++;
}
if (b == 255 && g > 0 && r == 0) {
g--;
}
if (b == 255 && r < 255 && g == 0) {
r++;
}
if (r == 255 && b > 0 && g == 0) {
b--;
}
}
public Color nextColor() {
nextRGB();
return makeColor();
}
private Color makeColor() {
return new Color(r, g, b);
}