Theory
Полная насыщенность (используемая HSL и аналогичными цветовыми схемами) фактически означает, что у вас есть одно значение RGB при полном, одно при 0 и одно при любом другом значении.
Причина этого заключается в том, что насыщенность основана на разнице между самым высоким и самым низким цветовыми компонентами и является самой высокой, когда они находятся в крайних значениях. Фактические определения являются более сложными (и включают в себя яркость), но достаточно сказать, что компонент 0 и другой из 1 дадут максимальное насыщение.
Алгоритм 1
Это приводит к относительно простому способу сделать это.
- Генерация случайного числа от 0 до 1.
- Назначьте это число случайным образом для элементов R, G и B.
- Произвольно присвоить ноль одному из оставшихся элементов.
- установить конечный элемент равным 1.
Это даст вам максимальную насыщенность цвета относительно просто.
Для реализации, вероятно, проще всего сгенерировать случайное число от 1 до 6 для 6 возможных вариантов выбора, для какого компонента вы назначаете 0, 1 и случайный элемент, а затем используете какой-то переключатель.
Это самый простой алгоритм, но не обязательно самая простая реализация из-за выбора / ветвления.
Алгоритм 2
Второй метод, предложенный Джимом Мишелем, основан на похожей теории, но реализован немного по-другому.
- Генерация случайных значений для каждого из компонентов R, G и B
- Найдите максимальный компонент.
- Найдите минимальный компонент.
- Установите максимальный компонент равным 1.
- Установите минимальный компонент на 0.
Это имеет тот же эффект установки одного значения в 1, одного в 0 и одного в случайное значение. У него есть то преимущество, что вам не нужно использовать грязный оператор switch, но вместо этого вы можете получить несколько грязных циклов. Также в зависимости от точности ваших компонентов (например, если вы идете прямо с байтами), тогда, если ваше среднее значение на самом деле равно вашему верху или низу (или все три одинаковы), то это может также сброситься в зависимости от того, как вы кодируете ваш алгоритм. Это в основном будет иметь эффект искажения случайности, но вряд ли это будет заметно заметно.
Реализация кода для метода два также любезно предоставлена Jim
int[] rgb = new int[3];
rgb[0] = rnd.Next(256); // red
rgb[1] = rnd.Next(256); // green
rgb[2] = rnd.Next(256); // blue
// Console.WriteLine("{0},{1},{2}", rgb[0], rgb[1], rgb[2]);
// find max and min indexes.
int max, min;
if (rgb[0] > rgb[1])
{
max = (rgb[0] > rgb[2]) ? 0 : 2
min = (rgb[1] < rgb[2]) ? 1 : 2;
}
else
{
max = (rgb[1] > rgb[2]) ? 1 : 2;
int notmax = 1 + max % 2;
min = (rgb[0] < rgb[notmax]) ? 0 : notmax;
}
rgb[max] = 255;
rgb[min] = 0;
// Console.WriteLine("{0},{1},{2}", rgb[0], rgb[1], rgb[2]);