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

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

Функция Абс(Инд)
	Возврат Макс(Инд, - Инд);
КонецФункции  

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

Комментарии (0)