Вход: растр, параметры (один или несколько индексов)
Выход: растр.
Данная процедура вычисляет одну или несколько формул, заданных пользователем, на основе значений входного растра.
Каждый канал нового растра соответствует одной формуле. Число каналов равно числу формул, заданных в параметрах. Высота и ширина нового растра равны высоте и ширине исходного растра.
Для доступа к пикселям исходного файла используется функция vn(m). Для точки с координатами (x, y, z) генерируемого растра вычисляется значение z-й формулы, причем значение функции vn(m) при вычислении этой формулы равно значению пикселя с координатами (x, y, m) исходного растра. Аргумент m должен быть целым числом от 1 до числа, равного количеству каналов в исходном файле. Примеры:
Функция v(m) работает аналогично, но ее аргументом является не номер канала, а длина волны в нанометрах. Программа будет использовать канал с ближайшей к указанной длиной волны. Максимальное расхождение длины волны — 10 нм. Если подходящий канал не найден, то выдается ошибка. Выбранные каналы записываются в лог.
При добавлении данной процедуре в редакторе процедур появится форма ввода формул. Для добавления индекса нажмите Добавить индекс. Укажите название индекса (необязательно). Введите код для вычисления индекса и нажмите OK. После этого будет показан список добавленных индексов. Чтобы изменить или удалить индекс, выделите его в списке и нажмите соответствующую кнопку под списком.
Синтаксис формул соответствует синтаксису JavaScript. Ниже описаны наиболее важные правила, использующиеся при написании формул.
Вы можете использовать целые числа (например, 42), числа с десятичной точкой (42.24), числа с экспонентой (5e-2, т.е. 0.05; 4.2e4, т.е. 42000).
Доступные операторы: +, -, *, /, % (сложение, вычитание, умножение, деление, остаток от деления). Если при вычислении возникает деление на нуль или другая ошибка, либо полученное значение равно бесконечности, такие результаты интерпретируются как нулевое значение и отображаются прозрачными точками.
Можно использовать тернарный оператор для условных вычислений: условие ? значение1 : значение2. Такое выражение равно первому значению, если условие истинно, и второму, если условие ложно. Например: vn(1) == 0? 0 : vn(1)+10, т.е. если значение в первом канале равно 0, вернуть 0, иначе вернуть значение в первом канале, увеличенное на 10.
Для расстановки приоритетов операций используйте круглые скобки:
Используйте пробелы для повышения читабельности формулы. Пробелы не влияют на вычисление формулы.
Можно использовать переменные для хранения промежуточных результатов. Переменные декларируются с помощью ключевого слова var. Не используйте переменные и именем a или b, т.к. это помешает использовать функции с этими именами. Для разделения выражений используйте точку с запятой и перенос строки. Пример:
var x = vn(2) * vn(4);
x * x - 2 * x
В выходной растр будет записан результат вычисления последнего выражения.
Доступны следующие математические функции и константы:
Выражение | Значение |
---|---|
Math.E | e (2.718) |
Math.LN2 | ln(2) (0.693) |
Math.LN10 | ln(10) (2.302) |
Math.LOG2E | log2(e) (1.442) |
Math.LOG10E | log10(e) (0.434) |
Math.PI | π (3.14) |
Math.SQRT1_2 | (0.707) |
Math.SQRT2 | (1.414) |
Math.abs(x) | модуль |
Math.acos(x) | арккосинус в радианах |
Math.asin(x) | арксинус в радианах |
Math.atan(x) | арктангенс в радианах (между -π/2 и π/2) |
Math.atan2(y,x) | арктангенс частного от его аргументов |
Math.ceil(x) | округление до целого в большую сторону |
Math.cos(x) | косинус (x в радианах) |
Math.exp(x) | |
Math.floor(x) | округление до целого в меньшую сторону |
Math.log(x) | натуральный логарифм |
Math.max(x,y,z,...,n) | максимальное значение |
Math.min(x,y,z,...,n) | минимальное значение |
Math.pow(x,y) | |
Math.random() | случайное значение в интервале [0, 1] |
Math.round(x) | округление до ближайшего целого |
Math.sin(x) | синус (x в радианах) |
Math.sqrt(x) | |
Math.tan(x) | тангенс (x в радианах) |
Например: Math.sqrt(vn(200)) + Math.pow(vn(100), 2).
Если формула была введена с ошибками, программа выдаст ошибку. Программа проверяет синтаксис, существование используемых функций. Однако формула может быть неправильной, даже если прошла первоначальную проверку (например, Math.pow(vn(200)) - неверная формула, т.к. функция принимает два аргумента, а передан один). Признаком неправильной функции являются нули в таблице значений.
При нажатии на кнопку добавления индексов из библиотеки открывается таблица с названиями индексов, описаниями и формулами. Соответствующий таблице csv-файл хранится по адресу data/indexes.csv. Индексы взяты из книги “Advances in Environmental Remote Sensing. Sensors, Algorithms and Applications”. Таблица позволяет выделять несколько строчек, при нажатии на кнопку “Добавить выделенные индексы” произойдет добавление выбранных индексов в форму редактора параметров процедуры вычисления индексов для растра.
Галочка “Показать неподходящие индексы” включает в таблице отображение индексов, которые невозможно вычислить для данного растра из-за ошибки в формуле или отсутствия в растре каналов с нужными длинами волн или номерами.