Немного поупражнялся с градиентами
Мысль о переходах цветов пришла мне на пробежке.
Я думал о том, что если есть шкала оценок приятия-неприятия по десятибальной шкале, можно сказать — мне нравится что-то от 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 + Дельта * НомерПерехода); КонецЕсли; Возврат С; КонецФункции Функция Абс(Инд) Возврат Макс(Инд, - Инд); КонецФункции
Обработка:
Поэкспериментируйте, если есть желание.
Свежие комментарии