2

Given two shapes, which are intersecting, how can we fill the area common to them in TikZ (i.e. the area between their intersecting points).

Here, the even odd rule might not work as it is not alternate filling but intersecting points.

Please note to determine the intersecting points, I am using the intersections library.

In the below MWE, how do I fill the area between C and C':

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections,through}
\begin{document}
\begin{tikzpicture}
  \coordinate (A) at (0,0);
  \coordinate (B) at (1.25,0.25);


  \node (E) [name path=E,draw,circle through=(B)] at (A) {};
  \node (F) [name path=F,draw,circle through=(A)] at (B) {};

  \path [name intersections={of=E and F, by={[label=above:$C$]C,[label=below:$C'$]C'}}];


\end{tikzpicture}
\end{document}

enter image description here

subham soni
  • 9,673

1 Answers1

5

The common area is obtained by clipping against one of the circles and filling the other.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections,through}
\makeatletter % from https://tex.stackexchange.com/a/127045/121799
\tikzset{use path/.code=\tikz@addmode{\pgfsyssoftpath@setcurrentpath#1}}
\makeatother
\begin{document}
\begin{tikzpicture}
  \coordinate (A) at (0,0);
  \coordinate (B) at (1.25,0.25);


  \node (E) [name path=E,draw,circle through=(B),save path=\pathA] at (A) {};
  \node (F) [name path=F,draw,circle through=(A),save path=\pathB] at (B) {};
  \begin{scope}
  \clip[use path=\pathA];
  \fill[blue,use path=\pathB];
  \end{scope}

  \path [name intersections={of=E and F, by={[label=above:$C$]C,[label=below:$C'$]C'}}];


\end{tikzpicture}
\end{document}

enter image description here

In case you are concerned by the fact that the circle contour gets partly overpainted, use backgrounds.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections,through,backgrounds}
\makeatletter % from https://tex.stackexchange.com/a/127045/121799
\tikzset{use path/.code=\tikz@addmode{\pgfsyssoftpath@setcurrentpath#1}}
\makeatother
\begin{document}
\begin{tikzpicture}
  \coordinate (A) at (0,0);
  \coordinate (B) at (1.25,0.25);


  \node (E) [name path=E,draw,circle through=(B),save path=\pathA] at (A) {};
  \node (F) [name path=F,draw,circle through=(A),save path=\pathB] at (B) {};
  \begin{scope}[on background layer]
  \clip[use path=\pathA];
  \fill[blue,use path=\pathB];
  \end{scope}

  \path [name intersections={of=E and F, by={[label=above:$C$]C,[label=below:$C'$]C'}}];


\end{tikzpicture}
\end{document}

You can always fill intersection segments. (You can combine this with the background stuff above.)

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepgfplotslibrary{fillbetween}
\pgfplotsset{compat=1.16}
\usetikzlibrary{through}
\begin{document}
\begin{tikzpicture}
  \coordinate (A) at (0,0);
  \coordinate (B) at (1.25,0.25);


  \node (E) [name path=E,draw,circle through=(B)] at (A) {};
  \node (F) [name path=F,draw,circle through=(A)] at (B) {};

  \path [name intersections={of=E and F, by={[label=above:$C$]C,[label=below:$C'$]C'}}];

  \path[%draw,red,thick,
  fill=blue,
  intersection segments={of=E and F,sequence={L1--R2--L3}}];
\end{tikzpicture}
\end{document}

(Same output as above.)

The analytic determination of the arcs is another possibility.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections,through,calc}
\begin{document}
\begin{tikzpicture}
  \coordinate (A) at (0,0);
  \coordinate (B) at (1.25,0.25);


  \node (E) [name path=E,draw,circle through=(B)] at (A) {};
  \node (F) [name path=F,draw,circle through=(A)] at (B) {};

  \path [name intersections={of=E and F, by={[label=above:$C$]C,[label=below:$C'$]C'}}];
  \path[fill=blue] let \p1=($(A.center)-(B.center)$),\p2=($(C.center)-(A.center)$),
  \p3=($(C'.center)-(A.center)$),\p4=($(C.center)-(B.center)$),
  \p5=($(C'.center)-(B.center)$),
  \n1={veclen(\x2,\y2)}, % radius A
  \n2={veclen(\x4,\y4)}, % radius B
  \n3={atan2(\y2,\x2)}, % angle A 1
  \n4={atan2(\y3,\x3)}, % angle A 2
  \n5={atan2(\y4,\x4)}, % angle B 1
  \n6={atan2(\y5,\x5)} % angle B 2
  in (C) arc(\n3:\n4:\n1)  arc(\n6:\n5-360:\n2);

\end{tikzpicture}
\end{document}
  • Thanks . Is there alternate to using clipping in TikZ. – subham soni Mar 17 '19 at 03:32
  • I feel clipping might not be a generic solution to the requirement. As mentioned in the question , the area can be anything between the n points. Is there a generic approach to solve this apart from clipping. – subham soni Mar 17 '19 at 03:34
  • Analytic determination of arcs will be tedious. Can you please elaborate the pgfplots solution as well – subham soni Mar 17 '19 at 03:39
  • @subhamsoni OK, I added the fillbetween stuff. –  Mar 17 '19 at 03:47
  • Can you please explain the parameter compat here – subham soni Mar 17 '19 at 03:50
  • @subhamsoni pgfplots has a very careful version management, so compat=1.16 indicates that version 1.16 is to be used. Almost certainly this has no effect here. However, I follow the practice to indicate the version because there are cases where that matters. –  Mar 17 '19 at 04:02
  • 2
    Thanks marmot. The answer and explanation is quite helpful – subham soni Mar 17 '19 at 04:08