2009-02-26 82 views
1

也许我喝了太多咖啡,可能我工作太久了,无论我对这种方法的作用感到不知所措,或者更确切地说,它为什么以及如何做,都没有人可以点亮在我身上?什么是下一个颜色?这种神秘的色彩方法是做什么的?它返回什么?

public Color nextColor() { 
    int max = 0, min = 1000000000, cr = 0, cg = 0, cb = 0; 
    for (int r = 0; r < 256; r += 4) { 
     for (int g = 0; g < 256; g += 4) { 
     for (int b = 0; b < 256; b += 4) { 
      if (r + g + b < 256 || r + g + b > 512) { 
       continue; 
      } 
      min = 1000000000; 
      for (Color c : colorTable) { 
       int dred = r - c.getRed(); 
       int dgreen = g - c.getGreen(); 
       int dblue = b - c.getBlue(); 
       int dif = dred * dred + dgreen * dgreen + dblue * dblue; 
       if (min > dif) { 
        min = dif; 
       } 
      } 
      if (max < min) { 
       max = min; 
       cr = r; 
       cg = g; 
       cb = b; 
      } 
     } 
     } 
    } 

    return new Color(cr, cg, cb, 0x90); 
} 

UPDATE

感谢您的答复大家。在程序中查看方法的上下文很明显,他们的意图确实是返回距离现有颜色集“最远”的新颜色。

感谢Sparr对这个问题提出followup,我肯定会在你的建议的基础上重写上述内容。

我不是很了解RGB色阶。了解上述方法的意图是检索“赠品?”颜色到现有颜色组合,在我们如何看待颜色的意义上,1中提供的解决方案实际上是否可以互补?是否有一种更简单的方法来选择与该组合相匹配的颜色,还是RGB组件的数值分析实际上会产生合适的颜色?

+0

哇!喜欢,颜色! – 2009-02-26 04:50:00

+1

你可能要发送这一个到TheDailyWTF.com – Uri 2009-02-26 04:53:18

回答

0

考虑由colorTable中的点定义的伪立体在其内部具有大的“空心”,使得nextColor将该空心的中心点选为nextColor的情况。根据你对colorTable的了解,这种情况可能非常罕见。如果预测结果非常稀少,并且在这些情况下您愿意接受一个不太理想的(假设我们将下一个色彩的输出作为最佳)解决方案,那么就会出现一个明显的优化。

在除上述之外的所有情况下,nextColor选择的颜色将位于最小凸包的表面某处,并包围由您的循环定义的1/64密度色彩空间中的所有点。生成该表面上的点列表比生成所有点列表的简单循环在计算上稍微复杂一些,但它会将搜索空间缩小约25倍。

在绝大多数情况下,简化搜索的结果将成为该凸包的一个角上的一个点。考虑到只有那些将你的搜索空间减少到一个简单的列表(24个候选人,如果我的心理几何对我很好),可以提前存储。

如果从这些颜色中选择的下一个颜色与您的colorTable“太接近”,那么您可以重新运行原始类型的搜索,以期找到上述的“空洞”类型。搜索的密度可以根据第一次传球的距离有多近,并从那里缩小。也就是说,如果超快速搜索在colorTable中发现距离其最近邻居8个单元的nextColor,则要比在颜色表内至少要找到至少16个单元的中空更好。运行8步的原始搜索并存储距离超过4个单位的任何候选项(空洞不可能与搜索网格对齐),然后在每个候选项上居中进行半径为12的更高密度搜索。

在我看来,您的搜索空间的1/64密度本质(所有倍数为4)可能是由原始作者为了加速搜索的目的而设立的。鉴于这些改进,您可以放弃这种妥协。

所有这一切都假定您想要坚持改进这种寻找对比色的天真方法。当然,有更好的方法,给定相同或更多(colorTable中的哪些颜色是您使用中最普遍的颜色?哪些颜色与人眼对比度更高)信息。

3

看起来像你有colortable这是一个存储颜色列表。

然后你的有分量

颜色的是 4的倍数,并“没有太多亮点” 而不是“太黑不是”这个奇怪的硬编码色彩空间。

这个功能似乎给了你后者中的颜色,它与你的颜色表“最佳对比”。

当我说对比时,这是通过使用2-范数选择尽可能远离颜色表的颜色来定义的。

1

给定的颜色对象的全局阵列命名colorTable,此功能会发现从下面的颜色空间中最接近*每一个数组中,然后这是最远的那些颜色的一个颜色:

红,绿,蓝分量的256和512

之间4 红+绿+蓝的多个*:“最接近”被定义为对于每个颜色分量差值的平方的总和最小。

正如保罗决定,这似乎是一个合理的,如果疯狂的低效执行,幼稚的方法寻找一个单一的颜色,提供colorTable内容的高对比度。同样的结果可以通过colorTable单次传递和更多的数学运算找到,而不是通过colorTable传递大约500万次,并且有更好的方法来找到提供更高平均对比度的不同颜色。

0

它试图让你得到另一种颜色

a)伪彩色编码数据集。 b)在图上画另一条线。

相关问题