有128个int(如++ i)如何生成128种不同的RGB颜色(int,int,int)?

时间:2013-03-20 08:15:40

标签: c++ rgb

我正在迭代多边形标志。我有128个独特的tham。我想知道如何获得每种可以抵抗的颜色(这样每个旗帜都会有或多或少的可叠加颜色)?如何从一个int获得这样的RGB int?

拥有像rand()%255, rand()%255, rand()%255这样的基于框架的模型材料并不会产生任何影响,而每个可靠的商店颜色都不是我想要的。 255-i变体不会提供难以消除的结果。所以我寻找一种算法来从给定的i获得可混淆的颜色。

我有一个迭代器iunsigned long long 128位掩码(000100100100 ...)。

6 个答案:

答案 0 :(得分:3)

128个数字是7位数据。我将7位分成(2,2,3)并使用它们(按某种顺序)作为红色,绿色和蓝色的高位。这应该在RGB颜色空间中尽可能地分散颜色。

答案 1 :(得分:2)

简单地使用网格r = 4,g = 8,b = 4很容易,但不一定产生最佳输出,因为暗色中应该有较少的不同色调。

Lab-space中的处理在每个单元之间具有最相等的感知距离,但我相信可以从YUV或HSV中找到合理的替代方案。

仅仅从评估其他答案的启发式/结果(我会尝试找到最好的duplicate from gamedeveloper网站),我认为最好的结果是其他格子而不是立方体。

   X   X   X
 X   X   X   X  <-- e.g. sampling points from hexagonical grid in HSV cone
   X   x   X    for some intensity level L.
 X   X   X   X
   X   X   X

典型的错误 IMO,是将下一级L + -1与L对齐;相反,如果下一个强度等级L + -1中的采样点旋转(45度),则附近颜色的色调和强度都会有差异。这个想法的另一个名称是为附近的颜色提供良好的汉明距离

     x   x  L&1==0,    x    L&1==1
       *             x   x
     x   x             x

同样在HSV锥体中,将有一个黑色,一个白色,三种颜色的深色,三种色调的鲜艳色彩,6或12种颜色在下一个强度等级。

游戏开发回答中的第二个优秀评论是文化偏见。我会陈述这个概念而不是我们给某些颜色赋予意义,并且可以很好地区分 sage 的颜色与橄榄 lavender 来自 fuchsia

编辑该链接中的第一个答案有173个投票,即使例如我无法区分颜色5和6.而且只有10种颜色。但该理论声称是合理的。

答案 2 :(得分:1)

这取决于您希望如何区分。

如果您发现在运行时创建颜色太困难了,那么在您知道的托盘中创建预定颜色的查找怎么样呢?

答案 3 :(得分:1)

生成最佳色彩的调色板并不容易。既然你说你需要固定数量的颜色,你可以预先生成一个颜色,例如:

http://tools.medialab.sciences-po.fr/iwanthue/

答案 4 :(得分:1)

如果你真的需要生成这些,而不是使用预先生成的调色板,我至少建议不要使用RGB。

例如,Lab颜色空间与人类视觉系统的关系更密切,因此在尝试查找感知上不同的颜色时可能更合适。

因此,您可能会尝试生成Lab中相距很远的颜色,然后转换回RGB。

答案 5 :(得分:0)

怎么样:

int get_red(int rep){
    int x,r=0,i,temp;
    i=0;
    temp=rep;
    while(temp!=0){
        i++;
        if(i==3) r=temp%2;
        temp=temp/2;
    }
    if(i>3) x=(long long int)255/(i-2);
    else x=255;
    temp=r*x;
    return temp;

}

int get_green(int rep){
    int x,g=0,i,temp;
    i=0;
    temp=rep;
    while(temp!=0){
        i++;
        if(i==2) g=temp%2;
        temp=temp/2;
    }
    if(i>3) x=(long long int)255/(i-2);
    else x=255;
    temp=g*x;
    return temp;
}

int get_blue(int rep){
    long long int x,b=0,i,temp;
    i=0;
    temp=rep;
    while(temp!=0){
        i++;
        if(i==1) b=temp%2;
        temp=temp/2;
    }
    if(i>3) x=(int)255/(i-2);
    else x=255;
    temp=b*x;
    return temp;
}