2011-04-01 167 views
2

假设我有一个带有构造函数RainbowColorsMapper(int n)的RainbowColorsMapper类,其中n> = 2。现在我想要使用方法mapper.getColor(int number)将彩虹颜色从红色连续映射到紫色,其中低值对应于红色结束,并且高度接近n到紫色结束。如果n = 2,则mapper.getColor(0)返回光谱的最左侧颜色(接近红色),mapper.getColor(1)返回最右侧的颜色。与自动缩放比例较大的n相同。将彩虹色映射到RGB

我的问题:这可以做到相对容易,如果是的话,算法的建议是什么?

+0

Er:“RainbowColorsMapper(int n),其中n> = 2”和“mapper.getColor(1)返回最正确的颜色”?你在说什么,威利斯? – 2011-04-01 13:04:22

+0

“与自动缩放比较大的n相同”是什么意思? – 2011-04-01 13:04:50

回答

6

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

+0

是的,似乎是最简单的方法。感谢您指出正确的方向。 – bvk256 2011-04-01 13:19:31

0

或者使用Hue饱和度颜色模型,并重复Hue。

1

记住,彩虹的颜色是根据波长有序,在你的模型所以基本上,n是某种相关到波长。所以你的问题基本归结为将波长(n)映射到RGB。这并不完全是微不足道的过程,但一开始,你可以检查这个问题了:

Convert light frequency to RGB?

+0

如果映射波长不会出现问题,这将是最佳选择。 – bvk256 2011-04-01 13:25:11

0

其相当容易,一旦你看着办吧。 代码下面将让你循环bewteen所有现有的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); 
    } 
+0

我可能是错的,但这样总有两个固定值,所以不会出现中音,对吗?我的意思是'5,230,123'例如是不可能的... – 2014-04-03 15:41:29