我有三个圆 A、B、C,它们的中心共线且间距相等。我想剪掉中间圆内但在其他两个圆外的区域。我做了一个简易版,剪掉里面的圆,然后用白色填充其他两个圆的内部。但是我仍然在填充的区域中看到中间圆的轮廓!?希望这是 MWE。
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[x=1mm,y=1mm,scale=5]
\coordinate (A) at (-6.928,0);
\coordinate (B) at (0,0);
\coordinate (C) at (6.928,0);
\clip (B) circle (6.0);
\draw[ultra thick] (B) circle (6.0);
\filldraw [fill=white,draw=black,thick] (A) circle (6);
\filldraw [fill=white,draw=black,thick] (C) circle (6);
\end{tikzpicture}
\end{document}
结果如下,显示了剪切区域的模糊轮廓。我错过了什么?!
答案1
你说“我想剪掉中间圆内、其他两个圆外的区域”。使用以下答案这个问题, 和这个,你可以使用这样的方式来实现reverseclip
:
\documentclass[border=1cm]{standalone}
\usepackage{tikz}
\tikzset{
reverseclip/.style={insert path={(-99cm,-99cm) rectangle (99cm,99cm)}}
}
\begin{document}
\begin{tikzpicture}[x=1mm,y=1mm,scale=5]
%before the clip
\fill[blue!30] (-10,-10) rectangle (10,10);
\coordinate (A) at (-6.928,0);
\coordinate (B) at (0,0);
\coordinate (C) at (6.928,0);
% clip
\begin{pgfinterruptboundingbox}
\clip (B) circle (6.0);
\clip[reverseclip] (A) circle (6);
\clip[reverseclip] (C) circle (6);
\end{pgfinterruptboundingbox}
% after the clip
\fill [orange] (-10,-10) rectangle (10,10);
\end{tikzpicture}
\end{document}
但是如果你想了解为什么你会看到中间圆圈的轮廓,那么我的回答就帮不了你。
更新:下图为原图和反向剪辑的图片:
\documentclass[border=7mm,varwidth]{standalone}
\usepackage{tikz}
\tikzset{
reverseclip/.style={insert path={(-99cm,-99cm) rectangle (99cm,99cm)}}
}
\begin{document}
\begin{tikzpicture}[x=1mm,y=1mm,scale=5]
\coordinate (A) at (-6.928,0);
\coordinate (B) at (0,0);
\coordinate (C) at (6.928,0);
\clip (B) circle (6.0);
\draw[ultra thick] (B) circle (6.0);
\filldraw [fill=white,draw=black,thick] (A) circle (6);
\filldraw [fill=white,draw=black,thick] (C) circle (6);
\end{tikzpicture}
\hspace{-4cm}
\begin{tikzpicture}[x=1mm,y=1mm,scale=5]
\coordinate (A) at (-6.928,0);
\coordinate (B) at (0,0);
\coordinate (C) at (6.928,0);
% clip
\begin{pgfinterruptboundingbox}
\clip (B) circle (6.0);
\clip[reverseclip] (A) circle (6);
\clip[reverseclip] (C) circle (6);
\end{pgfinterruptboundingbox}
% after the clip
\draw[ultra thick] (B) circle (6.0);
\filldraw [fill=white,draw=black,thick] (A) circle (6);
\filldraw [fill=white,draw=black,thick] (C) circle (6);
\end{tikzpicture}
\end{document}
在 Chrome 中:
并使用 ghostscript 进行转换(与苏门答腊视图相同):
答案2
虽然有解决方法,但我认为这里提出的问题是查看器伪像。以下代码只是使用PDF
文字来绘制类似的图片,并根据查看器的放大倍数产生类似的结果。但是打印很好(尽管某些应用程序可能会将生成的 PDF 视为损坏/损坏)。
\documentclass[border=10]{standalone}
\begin{document}
\pdfliteral{
q
% clip
-5 -5 m -5 5 l 5 5 l 5 -5 l h
W n
% centre rectangle
2 w 1 g
-5 -5 m -5 5 l 5 5 l 5 -5 l h
S
% upper rectanlge
1 w 1 g
1 1 m 1 11 l 11 11 l 11 1 l h
B
% lower rectangle
1 w 1 g
-1 -1 m -1 -11 l -11 -11 l -11 -1 l h
B
Q
}
\end{document}
此处显示的示例使用evince
文档查看器。我推测其他查看器可能会在 256% 放大倍数下显示类似的伪影:
放大512%,
放大1024%,
放大 2048% 后显示:
答案3
该解决方案提出的另一种方法是找到三个圆的交点(总共 4 个),然后使用这 4 个点形成一个覆盖主体的矩形并将其剪裁。
代码
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[x=1mm,y=1mm,scale=5]
\coordinate (A) at (-6.928,0);
\coordinate (B) at (0,0);
\coordinate (C) at (6.928,0);
% find intersection points of circles, to form a rectangle
\path[ultra thick,name path=b] (B) circle (6.0);
\path [name path=a] (A) circle (6);
\path [name path=c] (C) circle (6);
\fill[name intersections={of=a and b}];
\coordinate[yshift=1cm] (x1) at (intersection-1);
\coordinate[yshift=-1cm] (y1) at (intersection-2);
\fill[name intersections={of=b and c}];
\coordinate[yshift=1cm] (x2) at (intersection-1);
\coordinate[yshift=-1cm] (y2) at (intersection-2);
% clip the rectangle formed by the extended 4 corners
\clip (x1)--(y1)--(y2)--(x2);
\draw[ultra thick] (B) circle (6.0);
\filldraw [fill=white,draw=black,thick] (A) circle (6);
\filldraw [fill=white,draw=black,thick] (C) circle (6);
\end{tikzpicture}
\end{document}
答案4
所有答案都指出最初的问题是查看器问题。
在我的第一个答案中,我解释了如何使用 来解决这个问题reverseclip
。
我现在将尝试解释为什么此问题会出现在查看器中。
这只是猜测,但我认为可能性很高 ;)
首先:抗锯齿
如果我们在一个直径相同的黑色圆圈上绘制一个白色圆圈,由于抗锯齿,我检查过的所有查看器(Sumatra、Acrobat 8、Chrome、EBookDroid、Acrobat for Android、MuPDF、ezPDF、Google Document for Android)都会显示黑色圆圈的细灰色残留物。发生这种情况可能是因为它们首先使用抗锯齿绘制黑色圆圈,然后再使用抗锯齿绘制白色圆圈。
\begin{tikzpicture}
\fill[black] circle(1);
\fill[white] circle(1);
\begin{tikzpicture}
但是位图变换器(Photoshop CS5、ghostscript、Acrobat 8 导出为 PNG)没有显示可见的光晕,可能是因为它们首先渲染两个圆圈,然后进行抗锯齿。
剪裁
当观看者剪辑某些路径时,他们有两种选择:
- 逐个剪辑所有路径并随后渲染它们,或者
- 对所有路径进行分组,然后剪辑结果。
因此在下面的代码中
\begin{tikzpicture}
\clip circle(1);
\fill[black] circle(1);
\fill[white] circle(2);
\begin{tikzpicture}
一些查看器(如 Chrome 和 Acrobat 8、ezPDFReader、Android 版 Google Document)会分别剪切两个圆圈,然后再渲染它们,结果与第一个代码相同。而其他查看器(如 Sumatra、Android 版 Acrobat、EBookDroid、MuPDF)会先将路径分组,然后再剪切它们,结果会得到一个空白页(白色背景上的白色圆圈),就像位图转换器(ghostscript、Photoshop CS5 和 Acrobat 8 导出为 PNG)一样。
为了证明这一点,我们可以强制查看器在裁剪之前对路径进行分组transparency group
,这样在任何情况下都不会出现可见的光晕。以下是测试代码:
\documentclass[varwidth,border=7mm]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
% A: same in all viewers (visible halo)
\begin{scope}[shift={(0,0)}]
\fill[black] circle(1);
\fill[yellow!20] circle(1);
\node{A};
\end{scope}
% B: same in all viewers (visible halo)
\begin{scope}[shift={(3,0)}]
\fill[black] circle(1);
\clip circle(1);
\fill[yellow!20] circle(2); % clipped is the same as circle(1)
\node{B};
\end{scope}
% C: depends on viewer (clip separately paths or clip grouped paths ?)
\begin{scope}[shift={(0,-3)}]
\clip circle(1);
\fill[black] circle(1);
\fill[yellow!20] circle(2);
\node{C};
\end{scope}
% D: same in all viewers (no halo, due to grouping paths before clipping)
\begin{scope}[shift={(3,-3)}]
\clip circle(1);
\begin{scope}[transparency group]
\fill[black] circle(1);
\fill[yellow!20] circle(2);
\end{scope}
\node{D};
\end{scope}
\end{tikzpicture}
\end{document}