# Filling an area between two curves

I would like to draw the following figure:

To do this I have used the following codes :

\documentclass[10pt]{article}
\usepackage{pgf,tikz}
\usetikzlibrary{arrows}
\pagestyle{empty}
\begin{document}

\begin{tikzpicture}[line cap=round,line join=round,>=triangle 45,x=1.0cm,y=1.0cm]
\draw [rotate around={15.05:(6.07,0.75)}] (6.07,0.75) ellipse (1.11cm and 0.56cm);
\draw [rotate around={-13.74:(8.9,0.78)}] (8.9,0.78) ellipse (1.07cm and 0.53cm);
\draw  (4.58,2.02)-- (11,2);
\draw  (11,2)-- (10.48,-1);
\draw  (10.48,-1)-- (4,-1);
\draw  (4,-1)-- (4.58,2.02);
\draw [shift={(6.76,0.91)}] plot[domain=1.71:4.85,variable=\t]({1*0.43*cos(\t r)+0*0.43*sin(\t r)},{0*0.43*cos(\t r)+1*0.43*sin(\t r)});
\draw [shift={(8.25,0.9)}] plot[domain=-1.6:1.54,variable=\t]({1*0.42*cos(\t r)+0*0.42*sin(\t r)},{0*0.42*cos(\t r)+1*0.42*sin(\t r)});
\draw [rotate around={-3.74:(8.09,7.47)}] (8.09,7.47) ellipse (3.48cm and 1.89cm);
\draw [rotate around={13.37:(7.03,7.4)}] (7.03,7.4) ellipse (1.2cm and 0.59cm);
\draw [rotate around={-18.43:(8.48,7.38)}] (8.48,7.38) ellipse (1.23cm and 0.59cm);
\draw [->] (8.96,6.46) -- (8.8,1.62);
\draw [->] (6.7,6.38) -- (6.46,1.62);
\draw [->] (7.3,0.98) -- (7.76,0.98);

\draw (9.54,9.82) node {$M$};
\draw (6.8,7.3) node {$U_i$};
\draw (8.8,7.3) node {$U_j$};
\draw (6.24,4.34) node {$\psi_i$};
\draw (9.52,4.2) node {$\psi_j$};
\draw (8.94,-1.3) node {$\mathbf{R}^n$};
\draw (7.6,0) node {$\psi_j\circ \psi_i^{-1}$};

\end{tikzpicture}
\end{document}


It produces:

How can I shade this figure?

There are two basic tricks that allow you to fill the area bounded by two different curves/contours:

1. clip against one curve and fill the other;
2. use even odd rule.

And there are combinations of the two and other possibilities. This answer focuses on possibility 1. Then there is the question how on could recycle curves for the fill. Out of several possibilities, this answer will utilize the use path trick in the first part and insert path in the second path.

The first path modifies your code such as to shade the correct (?) areas.

\documentclass[10pt]{article}
\usepackage{tikz}
\usetikzlibrary{arrows}
\makeatletter % https://tex.stackexchange.com/a/38995/121799
\tikzset{
use path/.code={\pgfsyssoftpath@setcurrentpath{#1}}
}
\makeatother

\pagestyle{empty}
\begin{document}

\begin{tikzpicture}[line cap=round,line join=round,>=triangle 45,x=1.0cm,y=1.0cm]
\draw [rotate around={15.05:(6.07,0.75)},save path=\pathA] (6.07,0.75) ellipse (1.11cm and 0.56cm);
\draw [rotate around={-13.74:(8.9,0.78)},save path=\pathB] (8.9,0.78) ellipse (1.07cm and 0.53cm);
\draw  (4.58,2.02)-- (11,2);
\draw  (11,2)-- (10.48,-1);
\draw  (10.48,-1)-- (4,-1);
\draw  (4,-1)-- (4.58,2.02);
\draw [shift={(6.76,0.91)}] plot[domain=1.71:4.85,variable=\t]({1*0.43*cos(\t r)+0*0.43*sin(\t r)},{0*0.43*cos(\t r)+1*0.43*sin(\t r)});
\draw [shift={(8.25,0.9)}] plot[domain=-1.6:1.54,variable=\t]({1*0.42*cos(\t r)+0*0.42*sin(\t r)},{0*0.42*cos(\t r)+1*0.42*sin(\t r)});
\draw [rotate around={-3.74:(8.09,7.47)}] (8.09,7.47) ellipse (3.48cm and 1.89cm);
\draw [save path=\pathC,rotate around={13.37:(7.03,7.4)}] (7.03,7.4) ellipse (1.2cm and 0.59cm);
\draw [save path=\pathD,rotate around={-18.43:(8.48,7.38)}] (8.48,7.38) ellipse (1.23cm and 0.59cm);
\draw [->] (8.96,6.46) -- (8.8,1.62);
\draw [->] (6.7,6.38) -- (6.46,1.62);
\draw [->] (7.3,0.98) -- (7.76,0.98);

\draw (9.54,9.82) node {$M$};
\draw (6.8,7.3) node {$U_i$};
\draw (8.8,7.3) node {$U_j$};
\draw (6.24,4.34) node {$\psi_i$};
\draw (9.52,4.2) node {$\psi_j$};
\draw (8.94,-1.3) node {$\mathbf{R}^n$};
\draw (7.6,0) node {$\psi_j\circ \psi_i^{-1}$};
\begin{scope}
\clip[use path=\pathA];
\path[fill=blue,shift={(6.76,0.91)}] plot[domain=1.71:4.85,variable=\t]({1*0.43*cos(\t r)+0*0.43*sin(\t r)},{0*0.43*cos(\t r)+1*0.43*sin(\t r)})
-- ++ (1,0) |- cycle;
\end{scope}
\begin{scope}
\clip[use path=\pathB];
\path[fill=blue,shift={(8.25,0.9)}] plot[domain=-1.6:1.54,variable=\t]({1*0.42*cos(\t r)+0*0.42*sin(\t r)},{0*0.42*cos(\t r)+1*0.42*sin(\t r)})
-- ++ (-1,0) |- cycle;
\end{scope}
\clip[use path=\pathC];
\fill[blue,use path=\pathD];
\end{tikzpicture}
\end{document}


However, I am wondering if you are willing to consider an arguably simpler code yielding a similar picture. Advantages include more relative positioning such that you can move complete parts around without having to redo all coordinates.

\documentclass[10pt]{article}
\usepackage{tikz}
\usetikzlibrary{arrows,patterns}
\pagestyle{empty}
\begin{document}

\begin{tikzpicture}[line cap=round,line join=round,>=triangle
45,x=1.0cm,y=1.0cm,standard ellipse around/.style args={#1 rotated by #2}{%
\begin{scope}[yshift=6.5cm]
\node at (2,2.3) {$M$};
\draw (-0.7,-0.2) node[left] (Ui) {$U_i$}
[standard ellipse around={(-0.7,-0.2) rotated by 15}];
\draw (0.7,-0.2) node[right] (Uj) {$U_i$}
[standard ellipse around={(0.7,-0.2) rotated by -15}];
\clip[standard ellipse around={(0.7,-0.2) rotated by -15}];
\path[pattern=north east lines,
standard ellipse around={(-0.7,-0.2) rotated by 15}];
\end{scope}
\begin{scope}[local bounding box=b]
\begin{scope}[xshift=-4mm,local bounding box=bl]
\draw[clip,standard ellipse around={(-1.2,0) rotated by 15}];
\draw[pattern=north east lines,standard ellipse around={(0,0) rotated by -15}];
\end{scope}
\begin{scope}[xshift=4mm,local bounding box=br]
\draw[clip,standard ellipse around={(1.2,0) rotated by -15}];
\draw[pattern=north east lines,standard ellipse around={(0,0) rotated by 15}];
\end{scope}
\draw [->] (bl) -- (br) node[midway,below=8mm]{$\psi_j\circ \psi_i^{-1}$};
\end{scope}
\draw[->] ([yshift=-0.5cm]Ui.south) -- ([yshift=2mm]bl.north-|Ui.south)
node[midway,left]{$\psi_i$};
\draw[->] ([yshift=-0.5cm]Uj.south) -- ([yshift=2mm]br.north-|Uj.south)
node[midway,right]{$\psi_j$};
\draw ([xshift=-1.5cm,yshift=-1cm]b.south west)
-- ([xshift=-1cm,yshift=1cm]b.north west)
-- ([xshift=1.5cm,yshift=1cm]b.north east)
-- ([xshift=1cm,yshift=-1cm]b.south east) -- cycle;
\end{tikzpicture}
\end{document}


• Thank you very much for your answer@marmot – MKS Apr 9 '19 at 5:09
• @MKS You're welcome! – user121799 Apr 9 '19 at 5:11
• You can use \pgfsetpath instead of the low level \pgfsyssoftpath@setcurrentpath (as they are identical) and avoid \makeatletter ... \makeatother. – Kpym Apr 9 '19 at 13:52