下面的代码可以很好地完成$B / (A \cup C)$
提供的绘图工作$A \cap C = \emptyset$
,但是在重叠时会$A$
失败$C$
。
我该如何固定下部面板,以便只有其部分$B$
在外面$A$
并被$C$
填充?如果需要,它可以与顶行的解决方案不同,但对于两种情况,一个解决方案将是理想的。
我最近问过类似的问题其中的答案显示了如何在不使用白色填充圆圈 A 和 C 的情况下制作顶部面板,并希望可以针对这个新场景执行相同的操作。
\documentclass[tikz,border=1mm]{standalone}
\usetikzlibrary{math}
\begin{document}
\newcommand{\drawrow}[5]
{
\tikzmath{\xo=#1; \y=#2; \r=#3; \d=#4; \n=#5;};
\foreach \x in {1,...,\n}{
\draw ({\xo + (\x - 1) * \d}, \y) circle (\r) {};
}
}
\begin{tikzpicture}
\tikzmath{\r = 1; \d = 1.2; \x = -\d; \y=0;}
\def\A{({\x},\y) circle(\r)};
\def\B{({\x+\d},{\y}) circle(\r)};
\def\C{({\x+2*\d},{\y}) circle(\r)};
\begin{scope}
\clip \B;
\fill[lightgray, even odd rule] \B \A \C;
\end{scope}
\drawrow{\x}{\y}{\r}{\d}{3}
\node at ({\x}, \y) {A};
\node at ({\x+\d}, \y) {B};
\node at ({\x+2*\d}, \y) {C};
\tikzmath{\r = 1; \d = 0.8; \x = -\d; \y=-2.5;} %%%% <---- NOTE CHANGE IN \d
\def\A{({\x},\y) circle(\r)};
\def\B{({\x+\d},{\y}) circle(\r)};
\def\C{({\x+2*\d},{\y}) circle(\r)};
\begin{scope}
\clip \B;
\fill[lightgray, even odd rule] \B \A \C;
\end{scope}
\drawrow{\x}{\y}{\r}{\d}{3}
\node at ({\x}, \y) {A};
\node at ({\x+\d}, \y) {B};
\node at ({\x+2*\d}, \y) {C};
\end{tikzpicture}
\end{document}
答案1
这里事情变得有点复杂。我使用calc
和intersections
库来做到这一点。
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{intersections,calc}
\begin{document}
\begin{tikzpicture}
\newcommand{\R}{15mm}
\newcommand{\A}{(0,0) circle (\R)}
\newcommand{\B}{(1,0) circle (\R)}
\newcommand{\C}{(2,0) circle (\R)}
\path[name path=A] \A;
\path[name path=C] \C;
\path [name intersections={of=A and C}];
\begin{scope}
\clip \B;
\clip ($(intersection-1)+(-1,0)$) rectangle ++(2,1);
\fill[orange, even odd rule] \A \B \C;
\end{scope}
\begin{scope}
\clip \B;
\clip ($(intersection-2)+(-1,0)$) rectangle ++(2,-1);
\fill[orange, even odd rule] \A \B \C;
\end{scope}
\draw \A node {A} \B node {B} \C node {C};
\end{tikzpicture}
\end{document}
答案2
使用reverse clip
来自如何在 TikZ 中反转“剪辑”选择?那么这很简单。我们反向剪切A
和C
路径,然后剪切B
一个。
它不能很好地与standalone
类配合(由于使用current page
似乎没有正确定义的节点 - 但我猜测实际文档不是一个standalone
,如果是那么有办法解决这个问题)但是这样article
就没问题了。
其他一些小事:
- 您的代码中有一些错误
;
。只有路径命令需要以 结尾;
,其他命令(例如\tikzmath
)则不需要。 - 圆圈的正确语法是
circle[radius=..]
,您正在使用已弃用的旧语法。 - 我没有将整个路径存储在 中
\A
,\B
而是\C
定义了坐标。有了标签,感觉坐标比整个路径更经常被重复使用。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/642950/86}
\usepackage{tikz}
\usetikzlibrary{math}
% reverse clip from https://tex.stackexchange.com/q/12010/86
\tikzset{
reverse clip/.style={
overlay,
clip even odd rule,
insert path={(current page.north east) --
(current page.south east) --
(current page.south west) --
(current page.north west) --
(current page.north east)}
},
clip even odd rule/.code={%
\pgfseteorule
},
}
\newcommand{\drawrow}[5]
{
\tikzmath{\xo=#1; \y=#2; \r=#3; \d=#4; \n=#5;}
\foreach \x in {1,...,\n}{
% New syntax is `circle[radius=...]`
% and the `{}` is unnecessary
\draw ({\xo + (\x - 1) * \d}, \y) circle[radius=\r];
}
}
\begin{document}
\begin{tikzpicture}[remember picture]
\tikzmath{\r = 1; \d = 1.2; \x = -\d; \y=0;}
\coordinate (A) at (\x,\y);
\coordinate (B) at (\x+\d,\y);
\coordinate (C) at (\x+2*\d,\y);
\begin{scope}
\clip[reverse clip] (A) circle[radius=\r];
\clip[reverse clip] (C) circle[radius=\r];
\clip (B) circle[radius=\r];
\fill[lightgray]
(B) circle[radius=\r]
(A) circle[radius=\r]
(C) circle[radius=\r];
\end{scope}
\drawrow{\x}{\y}{\r}{\d}{3}
\foreach \lbl in {A,B,C}
{
\node at (\lbl) {\(\lbl\)};
}
\tikzmath{\r = 1; \d = 0.8; \x = -\d; \y=-2.5;} %%%% <---- NOTE CHANGE IN \d
\coordinate (A) at (\x,\y);
\coordinate (B) at (\x+\d,\y);
\coordinate (C) at (\x+2*\d,\y);
\begin{scope}
\clip[reverse clip] (A) circle[radius=\r];
\clip[reverse clip] (C) circle[radius=\r];
\clip (B) circle[radius=\r];
\fill[lightgray]
(B) circle[radius=\r]
(A) circle[radius=\r]
(C) circle[radius=\r];
\end{scope}
\drawrow{\x}{\y}{\r}{\d}{3}
\foreach \lbl in {A,B,C}
{
\node at (\lbl) {\(\lbl\)};
}
\end{tikzpicture}
\end{document}