アニメーションに便利な関数、手法です。
点の表示
plot sprintf("< echo ''%f %f''", x0,y0)
とすると点\((x_0,y_0)\)が描写されます。
窓関数
窓関数です。関数\(W(x)\)は、
\(
\displaystyle W(x)=\frac{r^{2^n}}{(x-x_c)^{2^n}+r^{2^n}}
\)
書かれます。この関数は\(r\)が窓の横幅を示し、\(n\)が窓の端の様子を決めるパラメータです。窓の広がりはおよそ\(2r\)です。
fwi(n,r,i,ic)=(real(r)**(2**n))/((real(i-ic))**(2**n)+real(r)**(2**n))
加速、減速
\(
\begin{align}
y(x)&=C_0\tanh(a(x-x_c))+C_1 \\
& C_0 = \frac{f_0-f_1}{t_0-t_1} \\
& C_1 = \frac{-t_1f_0+t_0f_1}{t_0-t_1} \\
& t_0 = \tanh(a(x_0-x_c)) \\
& t_1 = \tanh(a(x_1-x_c)) \\
& x_c = \frac{x_0+x_1}{2}
\end{align}
\)
の関数は点\((x_0,y_0)\)から点\((x_1,y_1)\)に\(\tanh(ax)\)で与えられる関数で書きます。
関数の中心は\((x_c,y_c)=((x_0+x_1)/2,(y_0+y_1)/2)\)になります。
画像の2つの赤い点は\((x_0,y_0)\)と\((x_1,y_1)\)を表しています。
\(a\)は変化の度合いを調節するパラメータです。
この関数は非常に使えます。ラミエルを作っている最中にこの関数を考えましたが、想像以上に役立ちます。
fth(a,x,x0,f0,x1,f1)=(f0-f1)*tanh(a*(real(x)-(x0+x1)*0.5e0))/(tanh(a*(real(x0)-(x0+x1)*0.5e0))-tanh(a*(real(x1)-(x0+x1)*0.5e0)))+(-f0*tanh(a*(real(x1)-(x0+x1)*0.5e0))+f1*tanh(a*(real(x0)-(x0+x1)*0.5e0)))/(tanh(a*(real(x0)-(x0+x1)*0.5e0))-tanh(a*(real(x1)-(x0+x1)*0.5e0)))
# x0,f0 --> x1,f1
# x0,f0 --> x1,f1
これはある時間内で高さを反転させるものです。コードはこちら。
set xr[-6:6]
set yr[0.8:2.2]
set size ratio 0.5 1
a=1e0
at=0.4e0
x0=-5e0
f0=1e0
x1=5e0
f1=2e0
#set term gif enhanced animate optimize delay 8 size 800,500
#set output 'extime_tanh.gif'
i0=0
i1=20
do for[i=i0:i1]{
ft0=fth(at,i,i0,f0,i1,f1)
ft1=fth(at,i,i0,f1,i1,f0)
plot fth(a,x,x0,ft0,x1,ft1) w l lt 2 lc 3 lw 5 ti sprintf("a=%3.2f, at=%3.2f, (x_0,f_0)=(%3.2f,%3.2f), (x_1,f_1)=(%3.2f,%3.2f)",a,at,x0,f0,x1,f1), sprintf("< echo ''%f %f''", x0,ft0) pt 7 ps 2 lc 7, sprintf("< echo ''%f %f''", x1,ft1) pt 7 ps 2 lc 7
}
#set out
#set terminal wxt enhanced
set yr[0.8:2.2]
set size ratio 0.5 1
a=1e0
at=0.4e0
x0=-5e0
f0=1e0
x1=5e0
f1=2e0
#set term gif enhanced animate optimize delay 8 size 800,500
#set output 'extime_tanh.gif'
i0=0
i1=20
do for[i=i0:i1]{
ft0=fth(at,i,i0,f0,i1,f1)
ft1=fth(at,i,i0,f1,i1,f0)
plot fth(a,x,x0,ft0,x1,ft1) w l lt 2 lc 3 lw 5 ti sprintf("a=%3.2f, at=%3.2f, (x_0,f_0)=(%3.2f,%3.2f), (x_1,f_1)=(%3.2f,%3.2f)",a,at,x0,f0,x1,f1), sprintf("< echo ''%f %f''", x0,ft0) pt 7 ps 2 lc 7, sprintf("< echo ''%f %f''", x1,ft1) pt 7 ps 2 lc 7
}
#set out
#set terminal wxt enhanced