这种神秘的颜色方法有什么作用?它返回了什么?

时间:2009-02-26 04:47:54

标签: java colors puzzle

也许我喝了太多咖啡,也许我工作的时间太长了,不管怎样,我对这种方法的作用感到茫然,或者更确切地说,为什么以及如何做到这一点,任何人都可以放弃一些点亮我?什么是nextColor?

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

更新

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

感谢Sparr对此问题提出followup,我一定会在考虑您的建议的情况下重写上述内容。

我对RGB色标并不十分熟悉。知道上述方法的意图是检索“免费?”对于现有的一组颜色的颜色,1中提供的解决方案在我们如何感知颜色的意义上实际上是互补的吗?是否有更简单的方法来选择一种可以补充该组的颜色,或者RGB组件的数值分析是否实际上产生了适当的颜色?

4 个答案:

答案 0 :(得分:3)

好像你有colortable这是一个存储颜色列表。

然后你有这个奇怪的硬编码色彩空间

  

具有组件的颜色   4的倍数并且“不太亮”   但也不“太黑”。

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

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

答案 1 :(得分:1)

给定名为colorTable的全局Color对象数组,此函数将从以下颜色空间中找到颜色空间中的颜色,该颜色空间与该数组中的每个颜色空间最接近*,然后是距离最远的颜色之一:

红色,绿色,蓝色成分是4的倍数 红色+绿色+蓝色介于256和512之间

*:“最接近”被定义为每种颜色成分的最小差异平方和。

正如保罗所确定的那样,这似乎是一种看似合理的,如果实际上效率低下,天真的方法来找到与colorTable的内容提供高对比度的单一颜色。通过colorTable单次传递和更多数学运算可以找到相同的结果,而不是通过colorTable传递大约500万次,并且有更好的方法可以找到提供更高平均对比度的不同颜色。

答案 2 :(得分:0)

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

a)对数据集进行伪彩色编码。

b)在图表上绘制另一条线。

答案 3 :(得分:0)

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

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

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

如果从那些中选择的nextColor与你的colorTable“太接近”,那么你可以回到运行原始类型的搜索,希望找到上面提到的那种“空洞”。可以根据第一次通过的接近程度来调整搜索的密度,并从那里缩小。也就是说,如果超快速搜索在colorTable中找到距其最近邻居的nextColor 8个单位,那么为了做得更好,你必须在colorTable中找到至少16个单位的空洞。以8步为单位运行原始搜索,并存储距离超过4个单位的任何候选项(空洞不太可能与搜索网格对齐),然后在每个候选项的中心进行半径为12的搜索。 / p>

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

所有这一切都假设您希望坚持改进这种寻找对比色的天真方法。肯定有更好的方法,给定相同或更多(colorTable中的颜色在您的使用中最常见?哪种颜色与人眼的对比度更高?)信息。