如何填充 TikZ 中 n 个相交点之间的区域

如何填充 TikZ 中 n 个相交点之间的区域

给定两个相交的形状,我们如何在 TikZ 中填充它们共同的区域(即它们相交点之间的区域)。

这里even odd rule可能不起作用,因为它不是交替填充而是相交点。

请注意,为了确定相交点,我正在使用该intersections库。

在下面的 MWE 中,如何填充C和之间的区域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}

在此处输入图片描述

答案1

通过剪切其中一个圆并填充另一个圆来获得公共区域。

\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}

在此处输入图片描述

如果您担心圆形轮廓被部分覆盖,请使用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}

您始终可以填充交叉线段。(您可以将其与上面的背景内容结合起来。)

\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}

(与上面输出相同。)

对弧的分析测定是另一种可能性。

\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}

相关内容