\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%
}
