Функция зависит от трех параметров: входного x , «левого края» и «правого края», причем левый край предполагается меньшим, чем правый край. Функция получает вещественное число x в качестве аргумента и возвращает 0, если x меньше или равен левому краю, 1, если x больше или равен правому краю, и плавно интерполирует, используя полином Эрмита , между 0 и 1 в противном случае. Градиент функции smoothstep равен нулю на обоих краях. Это удобно для создания последовательности переходов с использованием smoothstep для интерполяции каждого сегмента в качестве альтернативы использованию более сложных или дорогих методов интерполяции.
Характерная S-образная сигмоидальная кривая получается только при целых числах n ≥ 1. Порядок полинома в общем гладком шаге равен 2 n + 1. При n = 1 наклоны или первые производные гладкого шага равны нулю на левом и правом краю ( x = 0 и x = 1), где кривая присоединяется к постоянным или насыщенным уровням. При более высоком целом числе n вторые и более высокие производные равны нулю на краях, что делает полиномиальные функции максимально плоскими, а сращивание с предельными значениями 0 или 1 более плавным.
Вариации
Кен Перлин предложил [6] улучшенную версию обычно используемой функции первого порядка smoothstep, эквивалентную второму порядку ее общей формы. Она имеет нулевые производные 1-го и 2-го порядка при x = 0 и x = 1:
Реализация эталона C/C++:
float smootherstep ( float edge0 , float edge1 , float x ) { // Масштабируем и фиксируем x в диапазоне 0..1 x = clamp (( x - edge0 ) / ( edge1 - edge0 ));вернуть х * х * х * ( х * ( 6.0f * х - 15.0f ) + 10.0f ); }float clamp ( float x , float нижний предел = 0.0f , float верхний предел = 1.0f ) { if ( x < нижний предел ) return нижний предел ; if ( x > верхний предел ) return верхний предел ; return x ; }
Многочлены Smoothstep обобщаются, при этом 0 ≤ x ≤ 1
где N определяет порядок результирующей полиномиальной функции, который равен 2 N + 1. Первые семь полиномов smoothstep, при 0 ≤ x ≤ 1, равны
Дифференциал равен
Можно показать, что полиномы smoothstep , которые переходят от 0 к 1, когда x переходит от 0 к 1, можно просто отобразить в полиномы нечетной симметрии
где
и
Аргумент RN ( x ) равен −1 ≤ x ≤ 1 и добавляется к константе −1 слева и +1 справа.
Реализация на Javascript: [7]
// Обобщенная функция smoothstep generalSmoothStep ( N , x ) { x = clamp ( x , 0 , 1 ); // x должен быть равен или находиться в диапазоне от 0 до 1 var result = 0 ; for ( var n = 0 ; n < = N ; ++ n ) result + = pascalTriangle ( -N - 1 , n ) * pascalTriangle ( 2 * N + 1 , N - n ) * Math.pow ( x , N + n + 1 ) ; return result ; }// Возвращает биномиальный коэффициент без явного использования факториалов, // которые нельзя использовать с отрицательными целыми числами function pascalTriangle ( a , b ) { var result = 1 ; for ( var i = 0 ; i < b ; ++ i ) result *= ( a - i ) / ( i + 1 ); return result ; }функция clamp ( x , нижний предел , верхний предел ) { если ( x < нижний предел ) x = нижний предел ; если ( x > верхний предел ) x = верхний предел ; вернуть x ; }
Обратный сглаженный шаг
Обратное значение smoothstep() может быть полезным при выполнении определенных операций в компьютерной графике, когда его эффект необходимо обратить или компенсировать. В случае уравнения 3-го порядка существует аналитическое решение для обратного значения, которое выглядит так:
Это возникает как обратная функция , ряд Маклорена которой заканчивается в , что означает и выражает ту же функцию. С другой стороны, разложение в ряд обратной функции не заканчивается.
В ГЛСЛ:
float inverse_smoothstep ( float x ) { return 0.5 - sin ( asin ( 1.0 - 2.0 * x ) / 3.0 ); }