У меня есть 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);
Да, это очень хорошо для небольших сумм, но как только вы получаете 15 предметов, он начинает выглядеть немного грязно. Что вы подразумеваете под «полем сегментации цвета»? – wchargin
Я думаю, что вы столкнетесь с проблемой в целом с поиском большого количества цветов, которые выглядят отчетливо и не беспорядочно. Сегментация цвета используется во многих полях для алгоритмического оттенка различных типов данных. Обычно это не выходит за рамки 4 или 5 цветов (например, медицинское изображение) или цвета должны смешиваться (чтобы отображать разные плотности кости). Не могли бы вы также разместить некоторые образцы изображений? Мне любопытно, как они выглядят с помощью разных алгоритмов и пунктов. – nmjohn
Имейте в виду, что я дальтоник. Так или иначе! 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