2012-01-09 4 views
2

У меня есть ArrayList<Double>, значения которого преобразуются в фрагменты графика Arc2D.Pie на основе размера (то есть массив {1d,1d,2d,4d} создаст граф с четырьмя срезами, два из которых занимают восьмое каждого графа, один из которых занимает четвертый, а один из них занимает половину, а вместе с ним срезы будут расположены так, чтобы сформировать полный круг). Каждый из этих фрагментов окрашен по-разному, чтобы обеспечить легкое отображение срезов другим индикаторам (именам и т. Д.) И избегать бледности.Java: лучший алгоритм выбора цвета

Мой алгоритм выбора цвета изначально был довольно прост:

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

в попытке затемнить цвета; однако голубого цвета все еще трудно увидеть, а уменьшение яркости еще больше затрудняет выделение цветов.

Есть ли у кого-нибудь хороший, желательно простой алгоритм, который создаст спектр цветов, которые легко просматривать? Хорошим тестом было бы создать желтоватые и цианистые цвета и посмотреть, можно ли их легко просматривать на белом фоне.

Спасибо!

WC

EDIT: Теперь я улучшил свой алгоритм, чтобы сделать более разнообразные цвета, изменяя насыщенность и яркость. Тем не менее, цвета выглядят более жуткими; больше идей?

Новый алгоритм:

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

ответ

1

Лучший алгоритм, который я нашел до сих пор, использует a previous SO algorithm, который я изменил. Я держу 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); 

Получается с красивыми цветами, которые достаточно заметны.

Example image

Благодаря nmjohn за помощь мне решить эту проблему, давая мне идеи, и указал мне в правильном направлении!

WC

ПРИМЕЧАНИЕ: Я оставляю это открытым в течение двух дней. Если кто-нибудь придумает более хороший алгоритм, я приму его. В противном случае я приму это.

1

Мне нравится оттенки серого

Color.rgb(255 * (float)index/(float)total, 255 * (float)index/(float)total, 255 *  (float)index/(float)total); 

В противном случае, поле сегментации цвета довольно большой. Некоторые люди в порядке, разбивая его на группы.

В противном случае, если вам просто нужны 4 цвета, я бы выбрал те, которые работают хорошо и выбирают из таблицы: такие как красный, синий, зеленый и черный.

+0

Да, это очень хорошо для небольших сумм, но как только вы получаете 15 предметов, он начинает выглядеть немного грязно. Что вы подразумеваете под «полем сегментации цвета»? – wchargin

+0

Я думаю, что вы столкнетесь с проблемой в целом с поиском большого количества цветов, которые выглядят отчетливо и не беспорядочно. Сегментация цвета используется во многих полях для алгоритмического оттенка различных типов данных. Обычно это не выходит за рамки 4 или 5 цветов (например, медицинское изображение) или цвета должны смешиваться (чтобы отображать разные плотности кости). Не могли бы вы также разместить некоторые образцы изображений? Мне любопытно, как они выглядят с помощью разных алгоритмов и пунктов. – nmjohn

+0

Имейте в виду, что я дальтоник. Так или иначе! 5 цветов, которые вы можете легко отличить: [link] (http://img846.imageshack.us/img846/1955/5colors.png); 10 немного сложнее, но выполнимо: [link] (http://img35.imageshack.us/img35/3991/tencolorsn.png); 30, у вас нет шансов: [ссылка] (http://img820.imageshack.us/img820/8392/30colors.png). – wchargin

Смежные вопросы