也许我喝了太多咖啡,也许我工作的时间太长了,不管怎样,我对这种方法的作用感到茫然,或者更确切地说,为什么以及如何做到这一点,任何人都可以放弃一些点亮我?什么是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组件的数值分析是否实际上产生了适当的颜色?
答案 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中的颜色在您的使用中最常见?哪种颜色与人眼的对比度更高?)信息。