将彩虹颜色映射到RGB

假设我有一个类RainbowColorsMapper和构造函数RainbowColorsMapper(int n) ,其中n> = 2。 现在我希望连续映射彩虹色从红色到紫色,我使用方法mapper.getColor(int number) ,其中低值对应红色端,高值接近n到紫色端。 如果n = 2,则mapper.getColor(0)返回光谱的大部分左侧颜色(接近红色), mapper.getColor(1)返回最正确的颜色。 与自动缩放的较大n相同。

我的问题:这可以相对容易地完成,如果是,那么算法的建议是什么?

最简单的方法是在HSL颜色空间而不是RGB中工作。 创建饱和度和亮度固定的颜色(我建议为100%和50%),色调在合适的端点(您可能需要尝试查找)之间变化。 使用Color.getHSBColor将HSL值转换为RGB。

请记住,彩虹的颜色是根据波长排序的,所以基本上在你的模型中, n与波长有某种关系。 所以你的问题基本归结为将波长( n )映射到RGB。 这不是一个完全无关紧要的过程,但首先,你可以检查这个问题:

将光频率转换为RGB?

或者使用Hue饱和度值颜色模型,并迭代Hue。

您基本上在颜色模型中将色调从0更改为300

如何从Hue计算RGB,你可以在维基百科上找到

一旦你搞清楚它就相当容易了。 下面的代码将允许您循环所有现有的rbg颜色

  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); } 

HSL Color可让您轻松完成此操作。