Мысль о переходах цветов пришла мне на пробежке.
Я думал о том, что если есть шкала оценок приятия-неприятия по десятибалльной шкале, можно сказать — мне нравится что-то от 0 до 10 баллов или мне что-то не нравится от 0 до 10 баллов. Неплохо было бы разукрасить это цветами от зеленого (нравится) до красного (не нравится), посередине желтым.
За 15 минут набросал код первого градиента.
Усредненный градиент
Получил вот такие результаты:
Основной код выглядит так:
&НаСервере
Процедура СгенерироватьПереходыНаСервере()
Результат.Очистить();
Сч = 0;
Для Инд = -10 По 10 Цикл
Сч = Сч + 1;
Область = Результат.Область(Сч, 1);
Область.ШиринаКолонки = 100;
R = РасчитатьЦвет(Инд, Переходов, R1, R2);
G = РасчитатьЦвет(Инд, Переходов, G1, G2);
B = РасчитатьЦвет(Инд, Переходов, B1, B2);
Область.Текст = Строка(Инд) + " R: " + R + " G: " + G + " B: " + B;
Область.ЦветФона = Новый Цвет(R, G, B);
Область.ЦветТекста = Новый Цвет(255-R, 255-G, 255-B);
КонецЦикла;
КонецПроцедуры
Функция РасчитатьЦвет(Инд, Переходов, C1, C2) Экспорт
Дельта = (C2-C1)/Переходов;
НомерПерехода = (Переходов + Инд) / 2;
С = Цел(C1 + Дельта * НомерПерехода);
Возврат С;
КонецФункции
Сходящийся градиент из двух цветов
Получилось на так как я ожидал, посередине перехода от зеленого к красному ожидал чистый желтый, но что-то не срослось. Обычно в шкалах используется другая схема переходов. Подумав немного, я понял в чем проблема.
И использовал второй вариант градиента — схождение к нулю с галочкой «Схождение».
Здесь в каждом из направлений от нуля один из цветов фиксируется, а другой меняется.
Вот он, искомый градиент для шкалы оценок, визуально понятный!
На картинках все три основные вариации из двух цветов.
Сходящийся градиент из трех цветов
А что будет если поставить три цвета? Тоже красиво:
И даже сурово в монохроме:
Алгоритм:
Функция РасчитатьЦвет(Инд, Переходов, С1, C2) Экспорт
Дельта = (C2-С1)/Переходов;
НомерПерехода = (Переходов + Инд) / 2;
АбсИнд = Абс(Инд);
Если Схождение Тогда
Если С1 > 0 и Инд < 0 Тогда
С = С1;
ИначеЕсли С1 < 0 и Инд > 0 Тогда
С = -С1;
Иначе
К = (Переходов - АбсИнд) / Переходов;
С = Цел(Абс(С1) * К);
КонецЕсли;
Иначе
С = Цел(С1 + Дельта * НомерПерехода);
КонецЕсли;
Возврат С;
КонецФункции
Функция Абс(Инд)
Возврат Макс(Инд, - Инд);
КонецФункции
Поэкспериментируйте, если есть желание.