2013-03-20 85 views
2

我正在遍历多边形标志。我有128个独特的tham。我想知道如何获得每种颜色(这样每个国旗会有或多或少的颜色)?如何从一个int获得这样的RGB整数?如何生成128个不同的RGB颜色(int,int,int)?

拥有一个像rand()%255, rand()%255, rand()%255这样的基于框架的模型的东西并没有什么意义,而每个可见的商店颜色并不是我想要的。 255-i变体不会提供可预料的结果。所以我寻求一种算法来从给定的i获得可变色的颜色。

我有一个迭代器iunsigned long long 128位掩码(0001,0010,0100 ...)。

+1

128种颜色的眼睛区分?当您将两种不同的颜色并排放置时,您可能可以做到这一点,但是当按顺序呈现而不是同时呈现时,您可能无法区分出两种不同的蓝色。 – 2013-03-20 08:19:18

回答

1

这取决于你想要如何截然不同。

如果您发现在运行时创建颜色太困难,那么如何在托盘中创建预定义颜色的查找,您知道它们是不同的?

+0

这是主要问题 - 不错的渐变不是我所需要的,我需要在第一和第二和thisd之间的可呈现的颜色......以及最后的颜色......尽可能多。 – DuckQueen 2013-03-20 08:23:38

+0

@DuckQueen更新回答 – rhughes 2013-03-20 08:26:07

+0

@DuckQueen再次更新答案 – rhughes 2013-03-20 08:28:38

3

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

+8

AFAIK,人眼对绿色最为敏感。因此,我宁愿选择(2,3,2)(2,2,3)(如果这是RGB)。 – Spook 2013-03-20 08:22:27

+0

事实上,我有一个迭代器'我'也是一个'无符号长长面具。 – DuckQueen 2013-03-20 08:25:25

+0

@Spook - 感知距离的好处。我的“按某种顺序”的括号是因为我不确定哪种颜色应该得到三位。绿色似乎是最好的选择。 – 2013-03-20 08:29:56

1

生成最佳颜色的调色板并不容易。既然你说你需要的颜色一个固定的号码,你可以只预生成一个,比如这里:

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

+0

该页面确认了我对可区分性的担忧。如果可能的话,我会将这些信息的一部分编码成这128个独特多边形的形状或大小,或者使用一组图案(图片)而不是纯色。说,12种图案+ 12种不同的颜色,这是144个独特的组合。或者使用两种颜色的一种非对称图案,每种颜色均来自一组12个(黑色+白色,黑色+黄色,红色+白色,蓝色+黄色等)。 – 2013-03-20 09:54:02

1

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

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

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

2

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

实验室空间中的处理在每个单元之间的感知距离是最相等的,但我相信可以从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种颜色游戏开发者回答中出色的评论是文化偏见。因为我们给的含义赋予某些颜色,可以在从橄榄,或薰衣草紫红色区分圣人的颜色非常好,我将陈述的概念,而。

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

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