A decoration of a path which evolves with time. Options are available for changing the start amplitude, end amplitude and the wave length. Furthermore you decide whether it should start as a cosine or sine wave. The input of the items is also enabled as lists. Thus it regulates it self along the path. The start size and end size can be switched which gives a decreasing wave.
Edit and compile if you like:
% Author: Nick Papior Andersen % A decoration of a path which evolves with time. % Settings is there such that you can change the % start amplitude, end amplitude and the wave length. % Furthermore you decide whether it should start as a cosine or sine wave. % The input of the items is also enabled as lists. Thus it regulates it self along the path. % % Of course the start size and end size can be switched which gives a decreasing wave. \documentclass{article} \usepackage{tikz} \usepackage[active,tightpage]{preview} \PreviewEnvironment{tikzpicture} \setlength\PreviewBorder{5pt}% \usetikzlibrary{decorations.pathreplacing} \def\pgfdecorationgrowthstart{0cm} \def\pgfdecorationgrowthendsizelist{0cm} \def\pgfdecorationgrowthwavelengthlist{0cm} \def\pgfdecorationgrowthendstepslist{1} \def\pgfdecorationgrowthendstep{1} \newif\ifpgfdecorationgrowthsine \newif\ifpgfdecorationgrowthcosine \newif\ifpgfdecorationonewavelength \pgfdecorationgrowthcosinefalse \pgfdecorationgrowthsinetrue \pgfkeys{% /pgf/decoration/.cd, growth start size/.initial=0.5cm, growth end size/.initial=3cm, growth end steps/.initial=1, growth wave length/.initial=3pt, growth sine/.code={\pgfdecorationgrowthsinetrue\pgfdecorationgrowthcosinefalse}, growth cosine/.code={\pgfdecorationgrowthsinefalse\pgfdecorationgrowthcosinetrue} } \def\pgfdecorationgrowthsetup{% \global\edef\pgfdecorationgrowthstart{\pgfkeysvalueof{/pgf/decoration/growth start size}}% \global\edef\pgfdecorationgrowthendsizelist{\pgfkeysvalueof{/pgf/decoration/growth end size}}% \global\edef\pgfdecorationgrowthendstepslist{\pgfkeysvalueof{/pgf/decoration/growth end steps}}% \global\edef\pgfdecorationgrowthwavelengthlist{\pgfkeysvalueof{/pgf/decoration/growth wave length}}% } \def\pgfdecorationgrowthsteps{1} % To keep track of steps from ending \def\pgfdecorationliststeps{2} % To keep track of list items from ending, has to start from 2 \pgfdeclaredecoration{growth wave}{initial}% { \state{initial}[width=0pt,next state=first] {% \pgfdecorationgrowthsetup% \pgfpathlineto{\pgfqpoint{0pt}{0pt}}% \global\edef\pgfdecorationgrowthsteps{0}% \global\edef\pgfdecorationliststeps{2}% \foreach \endsize in \pgfdecorationgrowthendsizelist {% \global\edef\pgfdecorationgrowthendsize{\endsize}% \breakforeach% }% \foreach \growthstep in \pgfdecorationgrowthendstepslist {% \global\edef\pgfdecorationgrowthendstep{\growthstep}% \breakforeach% }% \foreach \wavelength in \pgfdecorationgrowthwavelengthlist {% \global\edef\pgfdecorationgrowthwavelength{\wavelength}% \breakforeach% }% \pgfmathparse{(\pgfdecorationgrowthendsize - \pgfdecorationgrowthstart) * 2 * % \pgfdecorationgrowthwavelength / ( \pgfdecoratedremainingdistance * \pgfdecorationgrowthendstep)}% \global\edef\pgfdecorationgrowth{\pgfmathresult}% }% \state{first}[width=2*\pgfdecorationgrowthwavelength,next state=second] {% \pgfdecorationgrowthstepcounters% \pgfmathparse{\pgfdecorationgrowthstart + \pgfdecorationgrowthsteps * \pgfdecorationgrowth}% % The wave starts \ifpgfdecorationgrowthsine% \pgfpathsine{\pgfqpoint{\pgfdecorationgrowthwavelength}{\pgfmathresult pt}}% \pgfpathcosine{\pgfqpoint{\pgfdecorationgrowthwavelength}{-\pgfmathresult pt}}% \fi% \ifpgfdecorationgrowthcosine% \pgfpathsine{\pgfqpoint{\pgfdecorationgrowthwavelength}{-\pgfmathresult pt}}% \pgfpathcosine{\pgfqpoint{\pgfdecorationgrowthwavelength}{\pgfmathresult pt}}% \fi% \pgfdecorationgrowthstateend% }% \state{second}[width=2*\pgfdecorationgrowthwavelength,next state=first] {% \pgfdecorationgrowthstepcounters% \pgfmathparse{\pgfdecorationgrowthstart + \pgfdecorationgrowthsteps * \pgfdecorationgrowth}% % The wave continues \ifpgfdecorationgrowthsine% \pgfpathsine{\pgfqpoint{\pgfdecorationgrowthwavelength}{-\pgfmathresult pt}}% \pgfpathcosine{\pgfqpoint{\pgfdecorationgrowthwavelength}{\pgfmathresult pt}}% \fi% \ifpgfdecorationgrowthcosine% \pgfpathsine{\pgfqpoint{\pgfdecorationgrowthwavelength}{\pgfmathresult pt}}% \pgfpathcosine{\pgfqpoint{\pgfdecorationgrowthwavelength}{-\pgfmathresult pt}}% \fi% \pgfdecorationgrowthstateend% } \state{final} {% \pgfpathlineto{\pgfpointdecoratedpathlast}% }% } \def\pgfdecorationgrowthstateend{% \pgfmathadd{\pgfdecorationgrowthsteps}{1}% \global\edef\pgfdecorationgrowthsteps{\pgfmathresult} % Redefine the steps counter, globally. } \def\pgfdecorationgrowthstepcounters{% \pgfmathparse{\pgfdecorationgrowthendstep * \pgfdecoratedpathlength} \ifdim\pgfdecoratedcompleteddistance>\pgfmathresult pt% \foreach \endsize [count=\count] in \pgfdecorationgrowthendsizelist {% \ifnum\count=\pgfdecorationliststeps% \global\edef\pgfdecorationgrowthendsize{\endsize}% \breakforeach% \else% \global\edef\pgfdecorationgrowthstart{\endsize}% \fi% }% \global\edef\tempa{0}% \foreach \growthstep [count=\count] in \pgfdecorationgrowthendstepslist {% \ifnum\count=\pgfdecorationliststeps% \global\edef\pgfdecorationgrowthendstep{\growthstep}% \breakforeach% \else% \global\edef\tempa{\growthstep}% \fi% }% \foreach \wavelength [count=\count] in \pgfdecorationgrowthwavelengthlist {% \ifnum\count=\pgfdecorationliststeps% \global\edef\pgfdecorationgrowthwavelength{\wavelength}% \breakforeach% \fi% }% \pgfmathparse{int(\pgfdecorationliststeps+1)}% \global\edef\pgfdecorationliststeps{\pgfmathresult}% \global\edef\pgfdecorationgrowthsteps{0}% Redefine the steps counter, globally. \pgfmathparse{(\pgfdecorationgrowthendsize-\pgfdecorationgrowthstart) * 2 % * \pgfdecorationgrowthwavelength / (\pgfdecoratedpathlength * (\pgfdecorationgrowthendstep -\tempa))}% \global\edef\pgfdecorationgrowth{\pgfmathresult}% \fi% } \begin{document} \begin{tikzpicture} \draw[decorate,decoration={growth wave, growth start size=2pt, growth end size=.5cm, growth wave length=5pt, growth cosine}] (0,0) -- (3,0); \draw[decorate,decoration={growth wave, growth start size=0pt, growth end size=.5cm, growth wave length=2pt, growth cosine},fill,color=red] (0,-1) rectangle (4,-4); \foreach \start/\end/\xstep/\ystep in {0/-10/5/-5,5/-5/10/-10,10/-10/5/-15,5/-15/0/-10} { \draw[fill,color=red,decorate,decoration={growth wave, % Choose the decoration growth start size=1pt, % Sets the start amplitude of the wave growth end size={1cm,3cm,1cm,1pt}, % Sets the end amplitude of the wave growth end steps={0.25,.5,.75,1}, % Sets the percentual path positions where the transitions % should be made growth wave length={1pt,3pt,3pt,1pt},% Sets the wave lengths growth sine}] % The wave starts as a sine (\start,\end) -- (\xstep,\ystep); \draw[fill,color=blue,decorate,decoration={growth wave, % Choose the decoration growth start size=1pt, % Sets the start amplitude of the wave growth end size={1cm,3cm,1cm,1pt}, % Sets the end amplitudes of the wave growth end steps={0.25,.5,.75,1}, % Sets the percentual path positions where the transitions % should be made growth wave length={1pt,3pt,3pt,1pt},% Sets the wave lengths growth cosine}] % The wave starts as a cosine (\start,\end) -- (\xstep,\ystep); } \draw[xshift=5cm, decorate,decoration={growth wave, growth start size=1cm, growth end size=1pt, growth wave length=2pt, growth cosine},fill,color=red] (0,0) -- (3,0); \end{tikzpicture} \end{document}
Click to download: growing-wave-decoration.tex • growing-wave-decoration.pdf
Open in Overleaf: growing-wave-decoration.tex