3

I am attempting to draw a barrel floating in water. I am trying to use pgfonlayer so that when the water line intersects the barrel, the line will be removed.

Also, I looked through small section in the manual on patterns, but I couldn't find a suitable pattern for water.

Here is the image I am trying to re-create:

enter image description here

Here is the code I have and the image:

\documentclass[tikz]{standalone}
\usetikzlibrary{patterns}

\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,foreground}

\begin{document}
\begin{tikzpicture}
  \begin{pgfonlayer}{foreground}
    % draw a barrel
    \draw (0, 0) ellipse[x radius = 1.5cm, y radius = 0.5cm]
    coordinate (B) at (-1.5cm, 0) coordinate (A) at (1.5cm, 0);
    \draw[dashed] (-1.5cm, -1cm) arc[x radius = 1.5cm, y radius = 0.5cm,
    start angle = 180, end angle = 360];
    \draw[dashed] (-1.5cm, -1.1cm) arc[x radius = 1.5cm, y radius = 0.5cm,
    start angle = 180, end angle = 360];
    \draw[dashed] (-1.5cm, -2cm) arc[x radius = 1.5cm, y radius = 0.5cm,
    start angle = 180, end angle = 360];
    \draw[dashed] (-1.5cm, -2.1cm) arc[x radius = 1.5cm, y radius = 0.5cm,
    start angle = 180, end angle = 360];
    \draw (-1.5cm, -3cm) coordinate (C) arc[x radius = 1.5cm, y radius = 0.5cm,
    start angle = 180, end angle = 360] coordinate (D);
    \draw (A) -- (D);
    \draw (B) -- (C);

    % draw the direction of the W = mg
    \fill[black] (0, -1.85cm) coordinate (W) circle[radius = 0.025cm];
    \draw[-stealth] (W) -- ++(0, -0.35cm) node[right, font = \scriptsize] {$mg$};

    % draw the barrel dimensions
    \begin{scope}[>=stealth]
      \draw[|<->|] (-1.5cm, 1cm) -- ++(3cm, 0) node[pos = 0.5,
      fill = white, font = \scriptsize, inner sep = 0.05cm] {$d$};
      \draw[|<->|] (-2cm, 0cm) -- ++(0, -3.5cm) node[pos = 0.5,
      fill = white, font = \scriptsize, inner sep = 0.05cm] {$\ell$};
    \end{scope}
  \end{pgfonlayer}

  % draw the water
  \begin{pgfonlayer}{background}
    \draw (-2.5cm, -1.5cm) -- ++(7cm, 0);
  \end{pgfonlayer}
\end{tikzpicture}
\end{document}

enter image description here

3

I have re-drawn the cylinder and filled it with white so that whatever is drawn on background layer, is not visible. Further, by manipulating the dash pattern and using \foreach loop with some xshift, the desired effect can be achieved.

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{patterns}

\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,foreground}

\begin{document}
\begin{tikzpicture}
  \begin{pgfonlayer}{foreground}
    % draw a barrel
    \draw[fill=white] (-1.5cm, 0) -- (-1.5cm, -3cm) coordinate (C) arc[x radius = 1.5cm, y radius = 0.5cm,
    start angle = 180, end angle = 360] coordinate (D) -- (1.5cm, 0) --(-1.5cm, 0) -- cycle;
%    \draw[red] (A) -- (D);
%    \draw[red] (B) -- (C);
    \draw[fill=white] (0, 0) ellipse[x radius = 1.5cm, y radius = 0.5cm]
    coordinate (B) at (-1.5cm, 0) coordinate (A) at (1.5cm, 0);
    \draw[dashed] (-1.5cm, -1cm) arc[x radius = 1.5cm, y radius = 0.5cm,
    start angle = 180, end angle = 360];
    \draw[dashed] (-1.5cm, -1.1cm) arc[x radius = 1.5cm, y radius = 0.5cm,
    start angle = 180, end angle = 360];
    \draw[dashed] (-1.5cm, -2cm) arc[x radius = 1.5cm, y radius = 0.5cm,
    start angle = 180, end angle = 360];
    \draw[dashed] (-1.5cm, -2.1cm) arc[x radius = 1.5cm, y radius = 0.5cm,
    start angle = 180, end angle = 360];


    % draw the direction of the W = mg
    \fill[black] (0, -1.85cm) coordinate (W) circle[radius = 0.025cm];
    \draw[-stealth] (W) -- ++(0, -0.35cm) node[right, font = \scriptsize] {$mg$};

    % draw the barrel dimensions
    \begin{scope}[>=stealth]
      \draw[|<->|] (-1.5cm, 1cm) -- ++(3cm, 0) node[pos = 0.5,
      fill = white, font = \scriptsize, inner sep = 0.05cm] {$d$};
      \draw[|<->|] (-2cm, 0cm) -- ++(0, -3.5cm) node[pos = 0.5,
      fill = white, font = \scriptsize, inner sep = 0.05cm] {$\ell$};
    \end{scope}
  \end{pgfonlayer}

  % draw the water
  \begin{pgfonlayer}{background}
    \draw[dash pattern=on 20pt off 10pt] (-2.5cm, -1.5cm) -- ++(6cm, 0);
    \foreach \x in {-1.7,-1.9,...,-4.1}{
      \draw[gray!30,dash pattern=on 4pt off 4pt] ([xshift=4pt]-2.5cm, \x cm) -- ++([xshift=-4pt]6cm, 0);
    }
    \foreach \x in {-1.6,-1.8,...,-4}{
      \draw[gray!30,dash pattern=on 4pt off 4pt] (-2.5cm, \x cm) -- ++(6cm, 0);
    }
  \end{pgfonlayer}
\end{tikzpicture}
\end{document}

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.