# Vibrating Curve in TikZ

I wrote the following code for a picture in TikZ. It is an illustration for an article in acoustics. It should give the impression that the boundary curve is vibrating. I would be grateful for suggestions on how to achieve that. Thanks.

\begin{tikzpicture}
\coordinate (omega-center) at (4.5,1.3);
\coordinate (omega0) at ($(omega-center)+(0:2.5cm)$);
\coordinate (omega1) at ($(omega-center)+(40:2cm)$);
\coordinate (omega2) at ($(omega-center)+(80:2.5cm)$);
\coordinate (omega3) at ($(omega-center)+(120:2.5cm)$);
\coordinate (omega4) at ($(omega-center)+(160:2.5cm)$);
\coordinate (omega5) at ($(omega-center)+(200:2.5cm)$);
\coordinate (omega6) at ($(omega-center)+(240:2cm)$);
\coordinate (omega7) at ($(omega-center)+(280:2cm)$);
\coordinate (omega8) at ($(omega-center)+(320:2cm)$);

\coordinate (omega0-out) at (90:1cm);
\coordinate (omega0-in) at (270:1cm);
\coordinate (omega1-out) at (90:1cm);
\coordinate (omega1-in) at (270:1cm);
\coordinate (omega2-out) at (90:1cm);
\coordinate (omega2-in) at (270:1cm);
\coordinate (omega3-out) at (250:1cm);
\coordinate (omega3-in) at (70:1cm);
\coordinate (omega4-out) at (200:1.5cm);
\coordinate (omega4-in) at (20:1cm);
\coordinate (omega5-out) at (20:1cm);
\coordinate (omega5-in) at (200:1cm);
\coordinate (omega6-out) at (60:1cm);
\coordinate (omega6-in) at (240:1cm);
\coordinate (omega7-out) at (70:1cm);
\coordinate (omega7-in) at (250:1cm);
\coordinate (omega8-out) at (90:1cm);
\coordinate (omega8-in) at (270:1cm);

\draw[black, very thick, fill=blue!10]
(omega0) .. controls +(omega0-out) and +(omega1-in) .. (omega1)
.. controls +(omega1-out) and +(omega2-in) .. (omega2)
.. controls +(omega2-out) and +(omega3-in) .. (omega3)
.. controls +(omega3-out) and +(omega4-in) .. (omega4)
.. controls +(omega4-out) and +(omega5-in) .. (omega5)
.. controls +(omega5-out) and +(omega6-in) .. (omega6)
.. controls +(omega6-out) and +(omega7-in) .. (omega7)
.. controls +(omega7-out) and +(omega8-in) .. (omega8)
.. controls +(omega8-out) and +(omega0-in) .. (omega0);
\end{tikzpicture}


• Try to insert some copies below the blue shape (so the code should come first) to produce some new shapes with different sizes and positions. For example, a lot of \draw[scale=1.1,yshift=6pt,black!50,thick] and change the scale, the shift, and so on. Oct 30, 2014 at 17:19

Here is an idea. Draw the same shape slightly rotated and transparent above the original one:

\usetikzlibrary{calc}
\begin{tikzpicture}
\coordinate (omega-center) at (4.5,1.3);
\coordinate (omega0) at ($(omega-center)+(0:2.5cm)$);
\coordinate (omega1) at ($(omega-center)+(40:2cm)$);
\coordinate (omega2) at ($(omega-center)+(80:2.5cm)$);
\coordinate (omega3) at ($(omega-center)+(120:2.5cm)$);
\coordinate (omega4) at ($(omega-center)+(160:2.5cm)$);
\coordinate (omega5) at ($(omega-center)+(200:2.5cm)$);
\coordinate (omega6) at ($(omega-center)+(240:2cm)$);
\coordinate (omega7) at ($(omega-center)+(280:2cm)$);
\coordinate (omega8) at ($(omega-center)+(320:2cm)$);

\coordinate (omega0-out) at (90:1cm);
\coordinate (omega0-in) at (270:1cm);
\coordinate (omega1-out) at (90:1cm);
\coordinate (omega1-in) at (270:1cm);
\coordinate (omega2-out) at (90:1cm);
\coordinate (omega2-in) at (270:1cm);
\coordinate (omega3-out) at (250:1cm);
\coordinate (omega3-in) at (70:1cm);
\coordinate (omega4-out) at (200:1.5cm);
\coordinate (omega4-in) at (20:1cm);
\coordinate (omega5-out) at (20:1cm);
\coordinate (omega5-in) at (200:1cm);
\coordinate (omega6-out) at (60:1cm);
\coordinate (omega6-in) at (240:1cm);
\coordinate (omega7-out) at (70:1cm);
\coordinate (omega7-in) at (250:1cm);
\coordinate (omega8-out) at (90:1cm);
\coordinate (omega8-in) at (270:1cm);

\def\myshape{
(omega0) .. controls +(omega0-out) and +(omega1-in) .. (omega1)
.. controls +(omega1-out) and +(omega2-in) .. (omega2)
.. controls +(omega2-out) and +(omega3-in) .. (omega3)
.. controls +(omega3-out) and +(omega4-in) .. (omega4)
.. controls +(omega4-out) and +(omega5-in) .. (omega5)
.. controls +(omega5-out) and +(omega6-in) .. (omega6)
.. controls +(omega6-out) and +(omega7-in) .. (omega7)
.. controls +(omega7-out) and +(omega8-in) .. (omega8)
.. controls +(omega8-out) and +(omega0-in) .. (omega0)
}

\draw[black, very thick, fill=blue!10] \myshape;
\begin{scope}[transform canvas={rotate around={3:(omega-center)}}]
\draw[black, very thick, draw opacity=0.3] \myshape;
\end{scope}
\begin{scope}[transform canvas={rotate around={-3:(omega-center)}}]
\draw[black, very thick, draw opacity=0.3]  \myshape;
\end{scope}
\end{tikzpicture}


Following the idea given by Dan H. in a comment, it is possible to add "more vibration" by adding more layers. I think that in this case the addditional layers should be thinner than the main one. For example:

  % Ommited all the initialization of coordinates, which is the same
\draw[black, very thick, fill=blue!10] \myshape;
\begin{scope}[transform canvas={rotate around={2:(omega-center)}}]
\draw[black, thick, draw opacity=0.3] \myshape;
\end{scope}
\begin{scope}[transform canvas={rotate around={-2:(omega-center)}}]
\draw[black, thick, draw opacity=0.3]  \myshape;
\end{scope}
\begin{scope}[transform canvas={rotate around={4:(omega-center)}}]
\draw[black, thick, draw opacity=0.1] \myshape;
\end{scope}
\begin{scope}[transform canvas={rotate around={-4:(omega-center)}}]
\draw[black, thick, draw opacity=0.1]  \myshape;
\end{scope}


Result:

• Nice! I've tried adding some decoration like snakes but the result is not so elegant. Oct 30, 2014 at 18:24
• Nice idea, to improve the appeareance you can alternate the rotation instead of one time by +3/-3, two times at +2/-2 and +4/-4 and change the opacity to .2 and .1, so the shape is "more vibrating". Oct 31, 2014 at 8:19
• @DanH. I updated the answer with your suggestion. Thank you! Oct 31, 2014 at 9:09
• To maximize the effect: \foreach \r/\o in {-5/05,-4/1,-3/2,-2/3,-1/4,1/4,2/3,3/2,4/1,5/05}{ \begin{scope}[transform canvas={rotate around={\r:(omega-center)}}] \draw[black, thick, draw opacity=0.\o] \myshape; \end{scope}} :) Oct 31, 2014 at 9:25

For the record I post also my final version. Instead of rotating the additional layers as suggested by JLDiaz I decided to scale them. Here is the result.

CODE:

\begin{tikzpicture}[scale=.5]
\coordinate (origin) at (-4.5,-1.3);
\coordinate (observer) at (-3,2.7);
\coordinate (x) at ($(origin) + (1,0,0)$);
\coordinate (y) at ($(origin) + (0,1,0)$);
\coordinate (z) at ($(origin) + (0,0,1)$);
\coordinate (sphere-center) at (-.5,.7);

\coordinate (bounded-label) at (.5,4.5);
\coordinate (unbounded-label) at (1.5,5.4);

\coordinate (omega-center) at (0,0);
\coordinate (omega0) at ($(omega-center)+(0:2.5cm)$);
\coordinate (omega1) at ($(omega-center)+(40:2cm)$);
\coordinate (omega2) at ($(omega-center)+(80:2.5cm)$);
\coordinate (omega3) at ($(omega-center)+(120:2.5cm)$);
\coordinate (omega4) at ($(omega-center)+(160:2.5cm)$);
\coordinate (omega5) at ($(omega-center)+(200:2.5cm)$);
\coordinate (omega6) at ($(omega-center)+(240:2cm)$);
\coordinate (omega7) at ($(omega-center)+(280:2cm)$);
\coordinate (omega8) at ($(omega-center)+(320:2cm)$);

\coordinate (omega0-out) at (90:1cm);
\coordinate (omega0-in) at (270:1cm);
\coordinate (omega1-out) at (90:1cm);
\coordinate (omega1-in) at (270:1cm);
\coordinate (omega2-out) at (90:1cm);
\coordinate (omega2-in) at (270:1cm);
\coordinate (omega3-out) at (250:1cm);
\coordinate (omega3-in) at (70:1cm);
\coordinate (omega4-out) at (200:1.5cm);
\coordinate (omega4-in) at (20:1cm);
\coordinate (omega5-out) at (20:1cm);
\coordinate (omega5-in) at (200:1cm);
\coordinate (omega6-out) at (60:1cm);
\coordinate (omega6-in) at (240:1cm);
\coordinate (omega7-out) at (70:1cm);
\coordinate (omega7-in) at (250:1cm);
\coordinate (omega8-out) at (90:1cm);
\coordinate (omega8-in) at (270:1cm);

\coordinate (normal) at (290:.8cm);

% Domain Omega
\def\myshape{
(omega0) .. controls +(omega0-out) and +(omega1-in) .. (omega1)
.. controls +(omega1-out) and +(omega2-in) .. (omega2)
.. controls +(omega2-out) and +(omega3-in) .. (omega3)
.. controls +(omega3-out) and +(omega4-in) .. (omega4)
.. controls +(omega4-out) and +(omega5-in) .. (omega5)
.. controls +(omega5-out) and +(omega6-in) .. (omega6)
.. controls +(omega6-out) and +(omega7-in) .. (omega7)
.. controls +(omega7-out) and +(omega8-in) .. (omega8)
.. controls +(omega8-out) and +(omega0-in) .. (omega0)
}

\tikzset{
vibrate/.style = {red,
thick}
}
\begin{scope}[transform canvas={scale = 1.06}]
\draw[vibrate, draw opacity=0.1] \myshape;
\end{scope}
\begin{scope}[transform canvas={scale = 1.04}]
\draw[vibrate, draw opacity=0.3] \myshape;
\end{scope}
\begin{scope}[transform canvas={scale = 1.02}]
\draw[vibrate, draw opacity=0.5] \myshape;
\end{scope}

\draw[red, thick] \myshape;

\begin{scope}[transform canvas={scale = 0.98}]
\draw[vibrate, draw opacity=0.5] \myshape;
\end{scope}
\begin{scope}[transform canvas={scale = 0.96}]
\draw[vibrate, draw opacity=0.3] \myshape;
\end{scope}
\begin{scope}[transform canvas={scale = 0.94}]
\draw[vibrate, draw opacity=0.1] \myshape;
\end{scope}

% Normal vector
\draw[-latex,label=$\mathbf{n}$] (omega4) -- node[pos=0.4, right] {\scriptsize $\ve{n}$} +(normal);

% Coordinate system
\fill (origin) circle (1pt);

\node[right] at (x) {\scriptsize $x$};
\node[above] at (y) {\scriptsize $y$};
\node[below] at (z) {\scriptsize $z$};

\draw[-latex] (origin) -- (x);
\draw[-latex] (origin) -- (y);
\draw[-latex] (origin) -- (z);

% Observer
\node[above right] at (observer) {\scriptsize $\vr$};
\fill (observer) circle (1pt);
\draw[-latex] (origin) -- (observer);

% Domain labels
\node at (omega-center) {$\Omega_+$};
\node[above right] at (omega1) {$\Gamma_v$};

\node[above] at (unbounded-label) {$\Omega_U$};
\node[above] at (bounded-label) {$\Omega_B$};
\end{tikzpicture}

• In my opinion, it looks worse than his solution :( Jan 26, 2015 at 23:00