Имея две пересекающиеся фигуры, как мы можем заполнить общую для них область в TikZ (т.е. область между их точками пересечения)?
Здесь это even odd rule
может не сработать, поскольку это не поочередное заполнение, а пересекающиеся точки.
Обратите внимание, что для определения точек пересечения я использую библиотеку intersections
.
Как заполнить область между C
и в приведенном ниже MWE 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}