【问题标题】:Map rainbow colors to RGB将彩虹色映射到 RGB
【发布时间】:2011-04-01 12:57:18
【问题描述】:

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

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

【问题讨论】:

  • Er: "RainbowColorsMapper(int n), where n>=2" and "mapper.getColor(1) 返回最正确的颜色"?你在说什么,威利斯?
  • “与更大的 n 相同,自动缩放”是什么意思?

标签: java rgb


【解决方案1】:

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

【讨论】:

  • 是的,似乎是最简单的方法。感谢您指出正确的方向。
【解决方案2】:

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

Convert light frequency to RGB?

【讨论】:

  • 如果映射波长不那么成问题,这将是最佳选择。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    你基本上在颜色模型中有一个从 0 到 300 的色调变化

    How to calculate RGB from Hue you can find on Wikipedia

    【讨论】:

      【解决方案5】:

      HSL Color 让您轻松做到这一点。

      【讨论】:

        【解决方案6】:
         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);
         }
        

        【讨论】:

        • 我可能错了,但是那样总是有两个固定值,所以不会有中间调,对吧?我的意思是5,230,123for example 是不可能的...
        猜你喜欢
        • 2016-04-27
        • 1970-01-01
        • 2015-10-04
        • 1970-01-01
        • 1970-01-01
        • 2021-06-12
        • 2016-04-06
        • 2018-06-21
        • 2011-03-12
        相关资源
        最近更新 更多