Java:更好的颜色选择算法
我有一个ArrayList<Double>
,其值根据大小转换成Arc2D.Pie
图的切片(即, {1d,1d,2d,4d}
的数组将创建一个包含四个切片的图形,其中两个它占据了每个图的八分之一,其中一个占据第四个,其中一个占据一半;一起,这些切片将被布置成形成一整圈)。 这些切片中的每一个都有不同的颜色,以允许将切片简单地映射到其他指示器(名称等)并避免温和。
我选择颜色的算法最初很简单:
public Color getColor(int index, int total) {
return Color.getHSBColor((float) index / (float) total, 1f, 1f);
}
然而,尽管这对大多数颜色(红色和蓝色,仅举几个例子)都适用,但一些(例如青色(尤其是突出显示为一组两个中的第二个元素;例如{1d, 3d}
的数组)是不容易被人眼看到,因为它们太轻。
我从那以后改变了算法
return Color.getHSBColor((float) index / (float) total, 1f, 0.8f);
试图使颜色变暗; 然而,青色仍然很难看到,降低亮度进一步使颜色相当难以区分。
有没有人有一个很好,最好是简单的算法,将创建一个容易看到的颜色的光谱? 一个好的测试是产生淡黄色和青色的颜色,看看它们是否在白色背景下易于观看。
谢谢!
厕所
编辑 :我现在改进了我的算法,通过改变饱和度和亮度来制作更多不同的颜色。 尽管如此,颜色看起来更加分明。 还有什么想法?
新算法:
float hue = (float) seriesIndex / (float) totalSeries;
int steps = 4;
float saturation = ((seriesIndex) % steps / (2f * steps)) + (0.5f);
float brightness = ((seriesIndex + ((steps + 1) / 2f)) % (steps + 1f) / (2f * (steps + 1f))) + 0.5f;
Color c = Color.getHSBColor(hue, saturation, brightness);
我喜欢灰度
Color.rgb( 255 * (float)index/(float)total, 255 * (float)index/(float)total, 255 * (float)index/(float)total);
否则,色彩分割领域相当大。 有些人可以把它分解成乐队。
否则,如果你只需要4种颜色,我会选择能够很好地工作并从桌子上选取的颜色:例如红色,蓝色,绿色和黑色。
到目前为止我发现的最好的算法使用了我修改过的以前的SO算法。 我将MIX
保持为一个浅灰色( Color.LIGHT_GRAY
),并使用种子Random
对象,这样每个迭代的颜色总是相同的,但在两者之间不同。
Random random = new Random(seriesIndex);
int red = random.nextInt(256);
int green = random.nextInt(256);
int blue = random.nextInt(256);
// mix the color
if (MIX != null) {
red = (red + MIX.getRed()) / 2;
green = (green + MIX.getGreen()) / 2;
blue = (blue + MIX.getBlue()) / 2;
}
Color c = new Color(red, green, blue);
原来漂亮的颜色相当可辨。
感谢nmjohn帮助我解决这个问题,给我一些想法,并指引我朝着正确的方向发展!
厕所
注意 :我会保留两天。 如果有人想出更好的算法,我会接受他的。 否则,我会接受这一点。
链接地址: http://www.djcxy.com/p/87077.html上一篇: Java: Better color selection algorithm
下一篇: CSS background