суббота, 5 июля 2008 г.

Сэмплы

В процессе работы над проектом построения карт плотности фотографий возникла необходимость построения различных градиентов. Простейшие градиенты наподобие "чёрный-красный", "зеленый-желтый" и чуть более сложные легко описываются соответствующей формулой в программе. Когда же речь заходит о градиентах наподобие "черный-красный-желтый-белый" в программе появляется куча условий и формул, что ухудшает её читаемость и гибкость. Для решения этой проблемы был использован механизм с использованим сэмплов.
Сэмпл - функция f(x), где х находится в диапазоне [0;1]. Значения функции так же принадлежат отрезку [0;1].
Основные сэмплы следующие:
"1" — Функция f(x) = 1. Равен 1 при любых значения x.
"0" — Функция f(x) = 0. Равен 0 при любых значения x.
"+" — Функция f(x) = (1-cos(x*pi))/2. Плавно возрастает от 0 до 1.
"-" — Функция f(x) = (1+cos(x*pi))/2. Плавно убывает от 1 до 0.


Основные сэмплы — желтый, бирюзовый, красный, зеленый. Плюс несколько дополнительных — более резкий подъем/спуск, "бугор" 0-1-0 или впадина 1-0-1 — тоже могут пригодиться.

Функция, реализующая механизм сэмплов, принимает в качестве параметров значение входной переменной, размер одиночного сэмпла и строку, представляющую собой последовательность сэмплов. Например, если значения входной переменной находятся на отрезке [0;1] и для преобразования её значения используются 4 сэмпла, размерность каждого сэмпла будет равна 1/4. Сама последовательность может быть представлена, например, так — "00+1".

Например, для реализации градиента "черный—красный—желтый—белый" необходимо применить следующие последовательности сэмплов:
Красный — "+11", зеленый — "0+1", синий — "00+".