解释

解释

我遇到一个涉及填充矩形的问题,虽然这可能是一个相当简单的问题,但它却完全难倒了我……

我知道如何为给定的颜色绘制一个矩形,并在该矩形的中心绘制一个圆圈,但是,我不知道如何忽略将圆圈放在矩形顶部的矩形的颜色!

    \begin{tikzpicture}
      \draw[black, fill = white, fill opacity = 0.5, semithick] (0,0) rectangle (5,);
      \draw[black, semithick] (2.5,2.5) circle (0.5);
    \end{tikzpicture}

有没有办法用特定颜色填充矩形,但中心的圆圈除外?这样该部分就没有颜色并且是透明的?

谢谢!

答案1

tikz 手册的第 15.4.2 节讨论了这一点

(章节编号可能会随着手册的更新而改变,它应该是与“图形参数:内部规则”相关的章节)

我会先复制手册中与问题相关的明确要点。然后粘贴你的答案。如果你不想阅读冗长的解释,你可以直接跳到答案

解释

事实上,TikZ 可以通过两种方式理解某个区域是否需要填充颜色。

  1. 非零规则,使用选项 指定nonzero rule,这是默认值。以下引用自手册:

    如果使用此规则(默认),则使用以下方法确定给定点是否在路径“内部”:

    从该点开始,向某个方向朝无穷远射出一条射线(选择的方向应确保不会出现奇怪的边界情况)。然后射线可能会击中路径。每当它击中路径时,我们就增加或减少计数器,该计数器最初为零。如果当路径“从左到右”(相对于射线)时射线击中路径,则计数器增加,否则减少。然后,最后,我们检查计数器是否非零(因此得名)。如果是,则认为该点位于“内部”,否则位于“外部”。听起来很复杂?确实如此。

  2. 奇偶规则,使用选项指定even odd rule,同样,从手册中复制:

    奇偶规则(无值)此选项导致使用不同的方法来确定路径的内部和外部。虽然使用这种方法,我们也会从我们希望确定它是在填充区域内还是在填充区域外的点发射射线。

    但是,这次我们只计算“击中”路径的次数,如果击中的次数为奇数,则声明该点位于“路径内”。使用奇偶规则,很容易在路径上“钻孔”。

解决方案

因此,在您的简单情况下,两个规则将产生相同的结果。您需要做的是将两个形状放在同一个路径命令(或\draw\fill)中,然后算法会负责在路径的“内部”打一个洞。

因此,不需要使用两个draw命令:

\documentclass{article}
\usepackage{tikz}
\begin{document}

\section{Non Zero Rule}

\begin{tikzpicture}
    \draw[black, fill = black, fill opacity = 0.5, semithick] 
        (0,0) rectangle (5,5) (2.5,2.5) circle (0.5);
\end{tikzpicture} 

\section{Even Odd Rule}

\begin{tikzpicture}
      \draw[black, fill = black, fill opacity = 0.5, semithick, even odd rule]
            (0,0) rectangle (5,5) (2.5,2.5) circle (0.5);
\end{tikzpicture}
\end{document}

解决方案

如您所见,这两条规则以同样的方式适用于您的形状。但要切孔,您更有可能使用“奇偶规则”,因为您不知道每个形状的绘制方向。

答案2

PSTricks 解决方案仅用于比较目的。

非零规则

\documentclass[pstricks,border=12pt]{standalone}
\begin{document}    
\begin{pspicture}[showgrid](6,6)
\pscustom[dimen=m,fillstyle=solid,fillcolor=yellow]
{
    \psframe(1,1)(5,5)
    \reversepath
    \pscircle(3,3){1}
}
\end{pspicture}
\end{document}

奇偶规则

\documentclass[pstricks,border=12pt]{standalone}
\begin{document}    
\begin{pspicture}[showgrid](6,6)
\pscustom[dimen=m,fillstyle=eofill,fillcolor=yellow]
{
    \psframe(1,1)(5,5)
    \pscircle(3,3){1}
}
\end{pspicture}    
\end{document}

在此处输入图片描述

相关内容