将彩虹色映射为RGB

问题描述 投票:3回答:6

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

我的问题:这样做相对容易吗?如果是,对算法有何建议?

java rgb
6个回答
7
投票

最简单的方法是在HSL colourspace中工作,而不是RGB。创建饱和度和亮度固定的颜色(我建议为100%和50%),并且色相在合适的端点之间有所不同(您可能需要进行实验才能找到)。使用Color.getHSBColor将HSL值转换为RGB。


1
投票

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

Convert light frequency to RGB?


0
投票

或使用“色相饱和度值”颜色模型,并在色相上进行迭代。


0
投票

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

How to calculate RGB from Hue you can find on Wikipedia


0
投票

HSL Color使您可以轻松进行此操作。


0
投票
 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);
 }
© www.soinside.com 2019 - 2024. All rights reserved.