Smoothstep

Grafico delle funzioni di primo ordine (smoothstep) e secondo ordine (smootherstep) normalizzate nell'intervallo [ 0 , 1 ] {\displaystyle [0,1]}

Smoothstep è una famiglia di funzioni sigmoidee usate per l'interpolazione hermitiana e per il clamping in computer grafica,[1][2] motori grafici,[3] e apprendimento automatico.[4]

Le smoothstep sono funzioni di una variabile reale a valori in [ 0 , 1 ] {\displaystyle [0,1]} , caratterizzate da due parametri a {\displaystyle a} e b {\displaystyle b} rappresentanti gli estremi di un intervallo [ a , b ] {\displaystyle [a,b]} di valori nel dominio. Per ogni x R {\displaystyle x\in \mathbb {R} } , smoothstep mappa i valori x ( a , b ) {\displaystyle x\in (a,b)} all'intervallo ( 0 , 1 ) {\displaystyle (0,1)} , mentre tutti i valori x a {\displaystyle x\leq a} sono mappati in zero, e tutti i valori x b {\displaystyle x\geq b} sono mappati in 1. Una funzione smoothstep normalizzata ha parametri a = 0 {\displaystyle a=0} e b = 1 {\displaystyle b=1} . Nel seguito, quando non differentemente specificato, si assume che la funzione smoothstep sia normalizzata.

La funzione smoothstep di ordine n {\displaystyle n} interpola i valori tra 0 e 1 in modo tale che:

  • quando la variabile è all'estremo sinistro dell'intervallo, l'immagine della funzione sia 0;
  • quando la variabile è all'estremo destro dell'intervallo, l'immagine della funzione sia 1;
  • le derivate (fino all'ordine n {\displaystyle n} ) della funzione presso gli estremi destro e sinistro abbiano valore zero.

Una funzione polinomiale che soddisfi tali vincoli può essere definita tramite l'interpolazione di Hermite. La funzione smoothstep per antonomasia è quella di primo ordine S 1 ( x ) {\displaystyle \operatorname {S} _{1}(x)} , definita da un polinomio di terzo grado:

smoothstep ( x ) = S 1 ( x ) = { 0 , x < 0 , 3 x 2 2 x 3 , 0 x 1 , 1 , x > 1. {\displaystyle \operatorname {smoothstep} (x)=\operatorname {S} _{1}(x)={\begin{cases}0,&x<0,\\3x^{2}-2x^{3},&0\leq x\leq 1,\\1,&x>1.\\\end{cases}}}

Restringendo il dominio in [ 0 , 1 ] {\displaystyle [0,1]} , la sua inversa può essere espressa analiticamente come:

S 1 1 ( x ) = 1 2 sin ( sin 1 ( 1 2 x ) 3 ) . {\displaystyle \operatorname {S} _{1}^{-1}(x)={\frac {1}{2}}-\sin \left({\frac {\sin ^{-1}(1-2x)}{3}}\right).}

La funzione smoothstep di ordine n {\displaystyle n} è rappresentata nella porzione centrale da un polinomio di Hermite di grado 2 n + 1 {\displaystyle 2n+1} e ha forma:

S n ( x ) = { 0 , x < 0 , x n + 1 , k = 0 n ( n + k k ) ( 2 n + 1 n k ) ( x ) k 0 x 1 , 1 , x > 1. {\displaystyle \operatorname {S} _{n}(x)={\begin{cases}0,&x<0,\\x^{n+1},\sum _{k=0}^{n}{\binom {n+k}{k}}{\binom {2n+1}{n-k}}(-x)^{k}&0\leq x\leq 1,\\1,&x>1.\\\end{cases}}}

La funzione smoothstep di ordine zero S 0 ( x ) {\displaystyle \operatorname {S} _{0}(x)} è equivalente alla funzione identità troncata (nota in alcuni contesti, ad esempio in computer grafica, come funzione clamp):

S 0 ( x ) = { 0 , x < 0 , x , 0 x 1 , 1 , x > 1. {\displaystyle \operatorname {S} _{0}(x)={\begin{cases}0,&x<0,\\x,&0\leq x\leq 1,\\1,&x>1.\\\end{cases}}}

La funzione smoothstep di secondo ordine S 2 ( x ) {\displaystyle \operatorname {S} _{2}(x)} , anche nota come smootherstep[5][6] e popolarizzata in computer grafica da Ken Perlin,[7][8][9] ha forma:

smootherstep ( x ) = S 2 ( x ) = { 0 , x < 0 , 6 x 5 15 x 4 + 10 x 3 , 0 x 1 , 1 , x > 1. {\displaystyle \operatorname {smootherstep} (x)=S_{2}(x)={\begin{cases}0,&x<0,\\6x^{5}-15x^{4}+10x^{3},&0\leq x\leq 1,\\1,&x>1.\\\end{cases}}}

Le successive funzioni smoothstep fino al sesto ordine sono rappresentate nell'intervallo [ 0 , 1 ] {\displaystyle [0,1]} dai seguenti polinomi:

S 3 ( x ) = 20 x 7 + 70 x 6 84 x 5 + 35 x 4 ; S 4 ( x ) = 70 x 9 315 x 8 + 540 x 7 420 x 6 + 126 x 5 ; S 5 ( x ) = 252 x 11 + 1386 x 10 3080 x 9 + 3465 x 8 1980 x 7 + 462 x 6 ; S 6 ( x ) = 924 x 13 6006 x 12 + 16380 x 11 24024 x 10 + 20020 x 9 9009 x 8 + 1716 x 7 . {\displaystyle {\begin{aligned}\operatorname {S} _{3}(x)&=-20x^{7}+70x^{6}-84x^{5}+35x^{4};\\\operatorname {S} _{4}(x)&=70x^{9}-315x^{8}+540x^{7}-420x^{6}+126x^{5};\\\operatorname {S} _{5}(x)&=-252x^{11}+1386x^{10}-3080x^{9}+3465x^{8}-1980x^{7}+462x^{6};\\\operatorname {S} _{6}(x)&=924x^{13}-6006x^{12}+16380x^{11}-24024x^{10}+20020x^{9}-9009x^{8}+1716x^{7}.\\\end{aligned}}}

Note

  1. ^ Smoothstep at Microsoft Developer Network.
  2. ^ GLSL Language Specification, Version 1.40.
  3. ^ Unity game engine SmoothStep documentation.
  4. ^ Hussein Hazimeh, Natalia Ponomareva, Petros Mol, Zhenyu Tan e Rahul Mazumder, The Tree Ensemble Layer: Differentiability meets Conditional Computation (PDF), International Conference on Machine Learning, PMLR, 2020.
  5. ^ tfp.math.smootherstep | Tensorflow, su tensorflow.org (archiviato dall'url originale il 2 novembre 2021).
  6. ^ SmootherStep | Wolfram Function Repository, su resources.wolframcloud.com (archiviato dall'url originale il 18 febbraio 2021).
  7. ^ Ken Perlin, An Image Synthesizer, ACM SIGGRAPH, vol. 24, n. 3, 1985.
  8. ^ Ken Perlin, Improving noise, ACM transactions on graphics, vol. 21, n. 3, luglio 2002, pp. 681-682.
  9. ^ Ken Perlin, Texturing and Modeling, Third Edition: A Procedural Approach.
  Portale Informatica
  Portale Matematica