# How to draw the figure of two cylindrical cups?

I need to draw two cylindrical cups, containing water, as in the following figure.

Did perhaps more laborious method, although I have not been able to finish. Can someone help me to complete?

\documentclass{article}
\usepackage[a4paper,bottom=2cm]{geometry}
\usepackage{tikz}
\usepackage{color}
\begin{document}
\begin{center}
\begin{tikzpicture}
\draw[fill=blue!20]  (-1.5,0)--(-1.5,2)--(1.5,2)--(1.5,0);
\draw[fill=blue!20] (0,0) ellipse (1.5cm and 0.5cm);
\draw (-1.5,0)--(-1.5,4);
\draw (1.5,0)--(1.5,4);
\draw (0,4) ellipse (1.5cm and 0.5cm);
\draw[fill=blue!50] (0,2) ellipse (1.5cm and 0.5cm);
\end{tikzpicture}
\begin{tikzpicture}
\draw[fill=blue!50] (1,1.6) ellipse (1.7cm and 0.6cm);
\begin{scope}[rotate=-30]
\draw[fill=blue!20] (0,0) ellipse (1.5cm and 0.5cm);
\draw (-1.5,0)--(-1.5,4);
\draw (1.5,0)--(1.5,4);
\draw (0,4) ellipse (1.5cm and 0.5cm);
\end{scope}
\end{tikzpicture}
\end{center}
\end{document}


• Did you try anything and encounter any issues? At a first look, this should not be that difficult, I would start with the left cup using e.g. \filldraw ellipse and \filldraw rectangle. For the second cup you can rotate parts of the first. – Ondrian Feb 21 '16 at 19:49
• To rotate the first part, as @Ondrian suggested, try \begin{scope}[rotate=30] code of first cup \end{scope} – Carina Feb 21 '16 at 19:54
• We've had something similar to this before, I think user loop space answered it – cmhughes Feb 21 '16 at 22:06
• Did perhaps more laborious method, although I have not been able to finish. Can someone help me to complete? – benedito Feb 22 '16 at 12:18
• this must be a duplicate somewhere – percusse Feb 22 '16 at 16:24

I don't really enjoy manual calculations, also because if you need more it gets tedious, so I made a newcommand:

\filltank[<optional rotation>]{<position>}{<fill>}

• <optional rotation> is how much you want to rotate the container. This is optional in the sense that if you don't say anything the rotation is 0.

• <position> is the position of the container (expressed through coordinates).

• <fill> is how much you want to fill the tank, expressed in 100 units. So, 100 is full, 0 is empty, 50 is half, and so on.

## Code

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

\usetikzlibrary{calc, intersections, decorations.markings}

\newcommand\filltank[3][0]{%
\coordinate (O) at (#2);
\begin{scope}[rotate around={#1:(O)}, shift={(#2)}]
\pgfmathsetmacro\mylevel{((#1/2)+#3)/100}
\coordinate (bottom) at (-1.5,0);
\path[postaction={decoration={%
markings, mark=at position \mylevel with \coordinate (lvl);
},decorate}] (-1.5,0)--(-1.5,4);
\path[name path=level] (lvl) --++ (-#1:4);
\path[name path=right] (1.5,0)--(1.5,4);
\path[name intersections={of=level and right,by=b}];
\fill[opacity=.5, blue!30] (b) -- (lvl) -- (bottom) arc (180:360:1.5cm and .5cm) -- cycle;
\path let
\p1 = (lvl),
\p2 = (b),
\n1 = {veclen((\x2-\x1),(\y2-\y1))}
in
(lvl) -- (b);
\begin{scope}[rotate={-#1}]
\fill[blue!50] let
\p1 = (lvl),
\p2 = (b),
\n1 = {veclen((\x2-\x1),(\y2-\y1))}
in (lvl) arc (180:0:\n1/2 and .5cm) (b) arc (360:180:\n1/2 and .5cm);
\end{scope}
\draw[thick] (0,0) ellipse (1.5cm and 0.5cm);
\draw[thick] (0,4) ellipse (1.5cm and 0.5cm);
\draw[thick] (-1.5,0)--(-1.5,4);
\draw[thick] (1.5,0)--(1.5,4);
\end{scope}
}

\begin{document}
\begin{tikzpicture}
\filltank{0,0}{50}

\filltank[-30]{4,0}{50}
\end{tikzpicture}
\end{document}