7

I'm trying to reproduce the following figure:

enter image description here

So far i have been able to do the following with Tikz:

\begin{tikzpicture}
   \def\r{1cm}
   \def\v{2.5mm}
   \foreach \n in {2,3,4,5,6}{
      \begin{scope}[xshift=\n*2*(\r+\v+1mm)]
         \draw[thick]  (0:{\r+\v})
         \foreach \a in {1,...,359}{ -- (\a:{\r+cos(\a*\n)*\v}) } -- cycle;
            \draw[dashed] circle (\r);
         \end{scope}
      }
  \end{tikzpicture}

That results in:

enter image description here

but i'm stucked for going futher. Any help is greatly appreciated.

2 Answers 2

10

A first approach, with a couple of nested loops and a declared function (that probably could be improved).

Update: I added the angles.

\documentclass[tikz,border=2mm]{standalone}
\tikzset
{% \x = angle, \h=wave height, \n=wave number
   declare function={wave(\x,\h,\n)=1+\h*sin(\n*\x-90*(\n-1));}
}
\begin{document}
\begin{tikzpicture}
\foreach\i in {2,...,6}
{
  \begin{scope}[shift={(3.5*\i,0)}]
    \node at (0,1.75) {$n=\i$};
    \draw[thick] (0,0) circle (1);
    \foreach\j in {0.1,0.2,0.3,0.4}
      \draw plot[domain=0:360,samples=181] ({wave(\x,\j,\i)*cos(\x)},{wave(\x,\j,\i)*sin(\x)});
   \pgfmathsetmacro\sa{-90+90*(4*\i-3)/\i} % start angle
   \pgfmathsetmacro\ea{\sa+360/\i}         % end angle
   \draw (\sa:2) -- (0,0) -- (\ea:2);
   \draw[latex-latex] (\sa:1.75) arc (\sa:\ea:1.75) node[midway,fill=white] {$\lambda_\i$};
   \end{scope}
}
\end{tikzpicture}
\end{document}

enter image description here

1
  • 3
    Wow Thanks a lot! I will add the color of the main wave myself. Really thanks you for make me win 10-20 hours of trial and errors! Apr 1, 2023 at 16:58
6

Because I just so much love pics:

\documentclass[border=10pt]{standalone}
\usepackage{tikz}

\newif\iforbitalwavedrawlabel
\tikzset{
    pics/orbital wave/.style={
        code={
            \tikzset{orbital wave/.cd, #1}
            \foreach \s [evaluate=\s as \t using \s/(\pgfkeysvalueof{/tikz/orbital wave/steps} + 1)] 
                in {0,...,\pgfkeysvalueof{/tikz/orbital wave/steps}} {
                \ifnum\s=0\relax
                    \draw[orbital wave/circle] 
                \else
                    \ifnum\s=\pgfkeysvalueof{/tikz/orbital wave/steps}\relax
                        \draw[orbital wave/wave] 
                    \else
                        \draw[orbital wave/step] 
                    \fi
                \fi
                    plot[domain=0:360, samples=181]
                    ({\x}:{
                        \pgfkeysvalueof{/tikz/orbital wave/circle radius} +
                        cos(\x * \pgfkeysvalueof{/tikz/orbital wave/frequency}) *
                        \pgfkeysvalueof{/tikz/orbital wave/amplitude} * \t
                    });
            }
            \iforbitalwavedrawlabel
            \draw[orbital wave/segment] 
                (\pgfkeysvalueof{/tikz/orbital wave/segment start angle}:\pgfkeysvalueof{/tikz/orbital wave/segment radius}) 
                -- (0,0) 
                -- (\pgfkeysvalueof{/tikz/orbital wave/segment end angle}:\pgfkeysvalueof{/tikz/orbital wave/segment radius});
            \draw[orbital wave/segment angle] 
                (\pgfkeysvalueof{/tikz/orbital wave/segment start angle}:{\pgfkeysvalueof{/tikz/orbital wave/segment radius}-\pgfkeysvalueof{/tikz/orbital wave/segment label indent}}) 
                arc[start angle=\pgfkeysvalueof{/tikz/orbital wave/segment start angle}, end angle=\pgfkeysvalueof{/tikz/orbital wave/segment end angle}, radius={\pgfkeysvalueof{/tikz/orbital wave/segment radius}-\pgfkeysvalueof{/tikz/orbital wave/segment label indent}}] 
                node[orbital wave/segment label] {\pgfkeysvalueof{/tikz/orbital wave/segment label text}};
            \fi
        }
    },
    orbital wave/steps/.initial={2},
    orbital wave/frequency/.initial={3},
    orbital wave/amplitude/.initial={1cm},
    orbital wave/circle radius/.initial={1cm},
    orbital wave/circle/.style={dashed},
    orbital wave/step/.style={thin},
    orbital wave/wave/.style={thick},
    orbital wave/draw label/.is if={orbitalwavedrawlabel},
    orbital wave/draw label,
    orbital wave/segment/.style={thin},
    orbital wave/segment angle/.style={stealth-stealth},
    orbital wave/segment label/.style={midway, circle, fill=white, inner sep=1pt},
    orbital wave/segment label indent/.initial={5pt},
    orbital wave/segment radius/.initial={2.5cm},
    orbital wave/segment start angle/.initial={90/\pgfkeysvalueof{/tikz/orbital wave/frequency}},
    orbital wave/segment end angle/.initial={450/\pgfkeysvalueof{/tikz/orbital wave/frequency}},
    orbital wave/segment label text/.initial={$\lambda_{\pgfkeysvalueof{/tikz/orbital wave/frequency}}$},
}

\begin{document}
\begin{tikzpicture}

\pic at (0,5) {orbital wave};

\pic[rotate=90] at (0,0)  {orbital wave={
        steps=4, 
        frequency=6, 
        amplitude=0.5cm, 
        wave/.append style={violet}
    }};

\pic at (5,1.75)  {orbital wave={
        steps=6, 
        frequency=10, 
        circle radius=2cm, 
        draw label=false, 
        circle/.style={red}, 
        step/.style={red!25}
    }};

\pic at (5,6) {orbital wave={
        frequency=4, 
        circle radius=0.5cm, 
        amplitude=0.25cm, 
        segment radius=1cm, 
        segment label indent=0pt,
        segment label text={\pgfkeysvalueof{/tikz/orbital wave/frequency}}, 
        segment label/.append style={text=green!75!black}, 
        segment/.style={red},
        segment angle/.style={blue},
        wave/.append style={orange}
    }};

\end{tikzpicture}
\end{document}  

enter image description here


The pictures you show seem to contain some sort of offset copy, so I added this to the pic:

\documentclass[border=10pt]{standalone}
\usepackage{tikz}

\newif\iforbitalwavedrawlabel
\newif\iforbitalwaveoffsetcopy
\tikzset{
    pics/orbital wave/.style={
        code={
            \tikzset{orbital wave/.cd, #1}
            \foreach \s [evaluate=\s as \t using \s/(\pgfkeysvalueof{/tikz/orbital wave/steps} + 1)] 
                in {0,...,\pgfkeysvalueof{/tikz/orbital wave/steps}} {
                \ifnum\s=0\relax
                    \draw[orbital wave/circle] 
                \else
                    \ifnum\s=\pgfkeysvalueof{/tikz/orbital wave/steps}\relax
                        \draw[orbital wave/wave] 
                    \else
                        \draw[orbital wave/step] 
                    \fi
                \fi
                    plot[domain=0:360, samples=181]
                    ({\x}:{
                        \pgfkeysvalueof{/tikz/orbital wave/circle radius} +
                        cos(\x * \pgfkeysvalueof{/tikz/orbital wave/frequency}) *
                        \pgfkeysvalueof{/tikz/orbital wave/amplitude} * \t
                    });
                \iforbitalwaveoffsetcopy
                    \ifnum\s=0\relax\else
                        \draw[orbital wave/copy] plot[domain=0:360, samples=181]
                            ({\x + 180/\pgfkeysvalueof{/tikz/orbital wave/frequency}}:{
                                \pgfkeysvalueof{/tikz/orbital wave/circle radius} +
                                cos(\x * \pgfkeysvalueof{/tikz/orbital wave/frequency}) *
                                \pgfkeysvalueof{/tikz/orbital wave/amplitude} * \t
                            });
                    \fi
                \fi
            }
            \iforbitalwavedrawlabel
            \draw[orbital wave/segment] 
                (\pgfkeysvalueof{/tikz/orbital wave/segment start angle}:\pgfkeysvalueof{/tikz/orbital wave/segment radius}) 
                -- (0,0) 
                -- (\pgfkeysvalueof{/tikz/orbital wave/segment end angle}:\pgfkeysvalueof{/tikz/orbital wave/segment radius});
            \draw[orbital wave/segment angle] 
                (\pgfkeysvalueof{/tikz/orbital wave/segment start angle}:{\pgfkeysvalueof{/tikz/orbital wave/segment radius}-\pgfkeysvalueof{/tikz/orbital wave/segment label indent}}) 
                arc[start angle=\pgfkeysvalueof{/tikz/orbital wave/segment start angle}, end angle=\pgfkeysvalueof{/tikz/orbital wave/segment end angle}, radius={\pgfkeysvalueof{/tikz/orbital wave/segment radius}-\pgfkeysvalueof{/tikz/orbital wave/segment label indent}}] 
                node[orbital wave/segment label] {\pgfkeysvalueof{/tikz/orbital wave/segment label text}};
            \fi
        }
    },
    orbital wave/steps/.initial={2},
    orbital wave/frequency/.initial={3},
    orbital wave/amplitude/.initial={1cm},
    orbital wave/circle radius/.initial={1cm},
    orbital wave/circle/.style={dashed},
    orbital wave/step/.style={thin},
    orbital wave/copy/.style={orbital wave/step},
    orbital wave/wave/.style={thick},
    orbital wave/offset copy/.is if={orbitalwaveoffsetcopy},
    orbital wave/offset copy,
    orbital wave/draw label/.is if={orbitalwavedrawlabel},
    orbital wave/draw label,
    orbital wave/segment/.style={thin},
    orbital wave/segment angle/.style={stealth-stealth},
    orbital wave/segment label/.style={midway, circle, fill=white, inner sep=1pt},
    orbital wave/segment label indent/.initial={5pt},
    orbital wave/segment radius/.initial={2.5cm},
    orbital wave/segment start angle/.initial={90/\pgfkeysvalueof{/tikz/orbital wave/frequency}},
    orbital wave/segment end angle/.initial={450/\pgfkeysvalueof{/tikz/orbital wave/frequency}},
    orbital wave/segment label text/.initial={$\lambda_{\pgfkeysvalueof{/tikz/orbital wave/frequency}}$},
}

\begin{document}
\begin{tikzpicture}

\pic at (-4,0) {orbital wave={
        steps=4, 
        amplitude=0.5cm, 
        wave/.append style={red},
        draw label=false,
        offset copy=false
    }};
    
\pic at (0,0) {orbital wave={
        steps=4, 
        amplitude=0.5cm, 
        wave/.append style={red},
        draw label=false
    }};

\pic at (4,0) {orbital wave={
        steps=4, 
        amplitude=0.5cm, 
        wave/.append style={red},
        copy/.append style={blue},
        draw label=false
    }};

\pic[rotate=90] at (-4,-4) {orbital wave={
        steps=4, 
        frequency=2,
        amplitude=0.5cm, 
        segment radius=2cm,
        step/.style={gray},
        circle/.style={solid, gray},
        wave/.append style={violet}
    }};

\pic[rotate=150] at (0,-4) {orbital wave={
        steps=4, 
        frequency=3,
        amplitude=0.5cm, 
        segment radius=2cm,
        step/.style={gray},
        circle/.style={solid, gray},
        wave/.append style={violet}
    }};

\pic[rotate=180] at (4,-4) {orbital wave={
        steps=4, 
        frequency=4,
        amplitude=0.5cm, 
        segment radius=2cm,
        step/.style={gray},
        circle/.style={solid, gray},
        wave/.append style={violet}
    }};

\end{tikzpicture}
\end{document}  

enter image description here

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .