Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:更好的颜色选择算法_Java_Algorithm_Language Agnostic_Colors_Usability - Fatal编程技术网

Java:更好的颜色选择算法

Java:更好的颜色选择算法,java,algorithm,language-agnostic,colors,usability,Java,Algorithm,Language Agnostic,Colors,Usability,我有一个ArrayList,它的值根据大小(即{1d,1d,2d,4d}的数组)转换成Arc2D.Pie图形的切片将创建一个包含四个切片的图形,其中两个切片各占图形的八分之一,其中一个切片占四分之一,另一个切片占一半;这些切片将一起排列形成一个完整的圆)。每个切片的颜色都不同,以便于将切片映射到其他指示器(名称等),并避免平淡 我最初选择颜色的算法非常简单: public Color getColor(int index, int total) { return Color.getHSB

我有一个
ArrayList
,它的值根据大小(即
{1d,1d,2d,4d}的数组)转换成
Arc2D.Pie
图形的切片
将创建一个包含四个切片的图形,其中两个切片各占图形的八分之一,其中一个切片占四分之一,另一个切片占一半;这些切片将一起排列形成一个完整的圆)。每个切片的颜色都不同,以便于将切片映射到其他指示器(名称等),并避免平淡

我最初选择颜色的算法非常简单:

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种颜色,我会从表中选择效果良好的颜色:如红色、蓝色、绿色和黑色。

我发现目前为止最好的算法使用的是我修改过的。我将
MIX
保持为恒定的浅灰色(
Color.light\u gray
),并使用一个种子
随机
对象,以便每次迭代的颜色总是相同的,但在每个迭代之间不同

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帮助我解决了这个问题,给了我一些想法,并为我指明了正确的方向

厕所


注意:我会让这个门开两天。如果有人提出更好的算法,我会接受他的。否则,我会接受这一点。

是的,这是非常好的少量,但一旦你超过15项,它开始看起来有点混乱。你所说的“颜色分割领域”是什么意思?我想你会遇到一个普遍的问题,那就是找到大量的颜色,这些颜色看起来都很清晰,不凌乱。颜色分割在许多领域中被用来对不同类型的数据进行算法着色。这通常不超过4或5种颜色(例如医学成像),或者颜色要混合在一起(以显示不同的骨密度)。你能不能也上传一些图片样本?我很好奇不同的算法和项目计数会是什么样子。请记住我是色盲。无论如何5种您可以轻松识别的颜色:;10有点难,但可行:;30,你没有机会:。另外:我正在编写一个图形引擎,所以我希望最终开发人员(可能是我,稍后)能够指定他想要多少个饼片,而不必担心颜色。啊,色盲会使它们更难区分。我同意,对于很多红色和蓝色的色调来说,30是不可能的。您总共要做多少项?对于选择颜色来说,这可能是一个更具颜色理论的问题,但可能没有一个好的算法。