即使用白色填充后,TikZ 中的剪辑仍会留下模糊的剪辑区域轮廓!

即使用白色填充后,TikZ 中的剪辑仍会留下模糊的剪辑区域轮廓!

我有三个圆 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}

ghostscript、Photoshop CS5 和 Acrobat 导出为 PNG 的结果:

在此处输入图片描述

Sumatra、Acrobat for Android、EBookDroid 和 MuPDF 中的结果:

在此处输入图片描述

Chrome、Acrobat 8​​、ezPDFReader 和 Google Docs for Android 中的显示结果:

在此处输入图片描述

相关内容