8

I would like to draw the following figure:
enter image description here

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:
enter image description here

How can I shade this figure?

14

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}

enter image description here

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}{%
insert path={[rotate around={#2:#1}] #1 circle[x radius=1.2cm,y radius=0.6cm]}}]
  \begin{scope}[yshift=6.5cm]
    \draw (0,0) circle[x radius=3.5cm,y radius=1.9cm];
    \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}

enter image description here

  • Thank you very much for your answer@marmot – MKS Apr 9 at 5:09
  • @MKS You're welcome! – marmot Apr 9 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 at 13:52

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.