Вы найдете цвета, с которыми легче работать в подобных проблемах, если вы будете использовать HSV вместо RGB.
«одинаково расположенные цвета» почти всегда означают «равновеликие оттенки».Таким образом, для [0,360) в оттенке вы просто равняете пространство, деля этот диапазон на равные.
Теперь у вас есть оттенок, и вам просто нужно найти «пастельную» версию этого оттенка.Для меня это значит немного обесцветить цвет.Я бы сказал, 80% насыщения для начинающих.
В своих тестах я использовал 100% для значения.Тогда просто конвертируйте в RGB.Вот то, с чем я играл:
<body>
<script>
// taken from http://ariya.blogspot.com/2008/07/converting-between-hsl-and-hsv.html
function hsv_to_hsl(s, v)
{
var ss, ll;
ll = (2. - s) * v;
ss = 1. * s * v;
ss /= (ll <= 1.) ? (ll) : 2. - ll;
ll /= 2.;
return [ss, ll];
}
function do_colors(sat, light)
{
n = 15;
document.write(n + " colors at " + sat + "% sat, " + light + "% lightness<br />");
for(var x = 0; x < n; ++x)
{
hue = 360.0 / n * x;
html_chunk = "<div style='width: 50px; height: 50px; display: inline-block; background: hsl(" + hue + ", " + sat + "%, " + light + "%);'> </div>";
document.write(html_chunk);
}
document.write("<br />");
}
do_colors(100, 50);
do_colors(95, 75);
do_colors(75, 50);
do_colors(100, 35);
// rudimentary averages from your colors
sl = hsv_to_hsl(.7, .9);
s = sl[0] * 100;
l = sl[1] * 100;
do_colors(s, l);
do_colors(75, 60);
</script>
</body>
Не C #, я знаю, но просто пытаюсь прибить свет и сел.
В противном случае, вы можете посмотреть на ваши образцы цветови посмотрите, есть ли какая-либо корреляция в значениях HSV / HSL, и попытайтесь вывести алгоритм из этого.Если вы построите графики S / H и V / H, вы увидите большое падение на графике серым цветом - это выглядит как выброс.(Третий слева в нижнем ряду.) Игнорируя это значение, S составляет около 75%, а значение чуть меньше 90%.Использование этих значений, вероятно, дало наилучший результат.
Ссылка: http://jsfiddle.net/ZHyAQ/