Немного поупражнялся с градиентами

от автора

Мысль о переходах цветов пришла мне на пробежке.

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

Поэкспериментируйте, если есть желание.


ссылка на оригинал статьи https://habr.com/ru/articles/876726/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *