![使用 TikZ 对四个圆的交点进行着色](https://linux22.com/image/392213/%E4%BD%BF%E7%94%A8%20TikZ%20%E5%AF%B9%E5%9B%9B%E4%B8%AA%E5%9C%86%E7%9A%84%E4%BA%A4%E7%82%B9%E8%BF%9B%E8%A1%8C%E7%9D%80%E8%89%B2.png)
我想要有选择地填充四个圆的交点,如下所示。
我可以正确地完成一些交叉点,但无法弄清楚如何完成剩余的交叉点。
这是 MWE 及其结果。
\documentclass[10pt]{article}
\usepackage{pgf,tikz}
\pagestyle{empty}
\begin{document}
\begin{tikzpicture}
\clip(0,0) rectangle (4.2,3);
\fill [fill=blue] (1.64,1.22) circle (1.16cm);
\fill[fill=white] (1.34,1.11) circle (0.53cm);
\fill[fill=blue](2.50,1.71) circle (1.18cm);
\fill [fill=blue](1.02,1.99) circle (0.82cm);
\clip [](1.02,1.99) circle (0.82cm);
\fill [fill=yellow] (1.34,1.11) circle (0.53cm);
\clip [] (2.50,1.71) circle (1.18cm);
\fill [fill=green] (1.34,1.11) circle (0.53cm);
\clip [] (1.02,1.99) circle (0.82cm);
\fill [fill=white] (2.50,1.71) circle (1.18cm);
\clip [] (1.64,1.22) circle (1.16cm);
\fill [fill=red] (2.50,1.71) circle (1.18cm);
\clip [] (1.34,1.11) circle (0.53cm);
\fill [fill=white] (1.02,1.99) circle (0.82cm);
\clip [] (1.34,1.11) circle (0.53cm);
\fill [fill=black] (2.50,1.71) circle (1.18cm);
\end{tikzpicture}
\end{document}
任何其他关于更有效或更轻松地绘制它的提示都将受到欢迎。
答案1
这会以不同的方式填充交叉点。从黑白图片中判断您到底想要实现什么有点困难,我提前为可能的误解道歉。还请注意,如果您希望将给定的剪辑仅应用于某些路径/填充,则需要将其放在范围内。并且以某种方式存储重复的路径可以说是有利的,一种可能性是insert path
。
\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
\begin{tikzpicture}[my circ/.style={insert path={
\ifcase#1
\or
(1.64,1.22) circle (1.16cm)
\or
(2.50,1.71) circle (1.18cm)
\or
(1.02,1.99) circle (0.82cm)
\or
(1.34,1.11) circle (0.53cm)
\fi}}]
\clip(0,0) rectangle (4.2,3);
\fill[blue,my circ/.list={1,2,3}];
\fill[white,my circ=4];
\foreach \Y/\Z in {{1,2}/magenta,{1,3}/magenta,{1,2,3}/yellow,{1,2,4}/green,{1,3,4}/orange,
{2,3,4}/purple,{2,3}/cyan,{1,2,3}/red}
{\begin{scope}
\foreach \X in \Y
{\clip [my circ=\X];}
\fill[\Z] (0,0) rectangle (4.2,3);
\end{scope}}
\end{tikzpicture}
\end{document}
至于您澄清的问题:使用even odd rule
。
\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
\begin{tikzpicture}[my circ/.style={insert path={
\ifcase#1
\or
(1.64,1.22) circle (1.16cm)
\or
(2.50,1.71) circle (1.18cm)
\or
(1.02,1.99) circle (0.82cm)
\or
(1.34,1.11) circle (0.53cm)
\fi}}]
\fill[even odd rule,my circ/.list={1,2,3,4}];
\end{tikzpicture}
\end{document}
答案2
查看@Raaja 发布的提示,我发现不使用scope
会导致剪辑无法渲染。通过为每个剪辑设置范围,我能够实现所需的构造。虽然解决方案并不优雅或高效,但也许可以使其更简单/更好。就是这样。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\path
(1.64,1.22) coordinate (C)
(1.34,1.11) coordinate (A)
(2.50,1.71) coordinate (B)
(1.02,1.99) coordinate (D);
\fill [fill=black](B) circle (1.18cm);
\fill [fill=black](C) circle (1.16cm);
\fill [fill=white](A) circle (0.53cm);
\fill [fill=black](D) circle (0.82cm);
\begin{scope}
\draw[clip] (B) circle (1.18cm);
\fill[white] (C) circle (1.16cm);
\end{scope}
\begin{scope}
\draw[clip] (A) circle (0.53cm);
\fill[black] (B) circle (1.18cm);
\end{scope}
\begin{scope}%top white corner
\draw[clip] (D) circle (0.82cm);
\fill[white] (B) circle (1.18cm);
\end{scope}
\begin{scope}
\draw[clip] (D) circle (0.82cm);
\fill[white] (C) circle (1.16cm);
\end{scope}
\begin{scope}
\draw[clip] (A) circle (0.53cm);
\fill [black] (D) circle (0.82cm);
\end{scope}
\begin{scope}%
\draw[clip] (B) circle (1.18cm);
\draw[clip] (C) circle (1.16cm);
\fill[black] (D) circle (0.82cm);
\end{scope}
\begin{scope}% centre white triangle
\draw[clip] (B) circle (1.18cm);
\draw[clip] (C) circle (1.16cm);
\draw[clip] (A) circle (0.53cm);
\fill[white] (D) circle (0.82cm);
\end{scope}
\end{tikzpicture}
\end{document}
尽管使用黑色以外的任何其他颜色,都会产生带有黑色轮廓的图像,我无法将其去除。使用任何选项似乎clip
都是不允许的。