使用 TikZ 填充交叉口的问题

使用 TikZ 填充交叉口的问题

我试图使用 TikZ 绘制一个图形,我想填充四个圆的公共区域,这四个圆的中心位于正方形的四个点,并且圆弧的半径是正方形长度的 0.9772。

我使用以下代码:

\begin{tikzpicture}[scale = 4]
\clip (-0.2, -0.2) rectangle (1.2,1.2);
\begin{scope}[even odd rule]
\clip (0.9772,0) arc (0:90:0.9772);
\clip (0.0228,1) arc (180:270:0.9772);
\fill [fill = green] (0,0) rectangle (1,1);
\end{scope}
\begin{scope}[even odd rule]
\clip (1,0.9772) arc (90:180:0.9772);
\clip (0,0.0228) arc (270:360:0.9772);
\fill [fill = green] (0,0) rectangle (1,1);
\end{scope}
\draw [very thick](0,0) rectangle (1,1);
\draw [very thin] (0.9772,0) arc (0:90:0.9772);
\draw [very thin] (1,0.9772) arc (90:180:0.9772);
\draw [very thin] (0.0228,1) arc (180:270:0.9772);
\draw [very thin] (0,0.0228) arc (270:360:0.9772);
\end{tikzpicture}

然而,我得到了这样的奇怪的图画:

为什么这不起作用?我使用类似的代码生成了类似的图形,但半径较小,图形成功生成如下:

那么有人可以帮我吗?

答案1

裁剪和填充一样,必须使用封闭路径。因此,当您为 TikZ/PGF 提供一条开放路径并要求其进行裁剪或填充时,它会(明智地)先将其关闭,然后再尝试对其进行填充或裁剪。由于这对这个问题至关重要,而且我花了一些实验才意识到这里发生了什么,我想强调这一点并将其制定为一条规则:

调试剪辑时,使用以下方式渲染路径填充,不绘制。

如果我们对您的图表进行上述操作,我们可以看到发生了什么:当 TikZ/PGF 闭合弧线时,随着半径的增加,这会切入您想要描述的区域。随着半径从 增加到 ,这0.80.9非问题变成了问题,如以下进展所示:浅灰色区域是由路径定义的,深灰色是它们的交点,这是剪切产生的:

交叉口进展

解决方案是确保路径足够大,可以包含要渲染的区域。另一个要点是,最好确保路径足够大明确地关闭,这样你就不会遇到任何意外的惊喜。由于你已经根据更大的矩形进行裁剪(因此边界框已设置),因此你可以简单地在每个角上画圆。另一种方法是将圆弧连接到角上。无论哪种方式,与上图相同的图表将是:

具有封闭路径的交叉口进展

这正是你想要的。

可能有很多方法可以做到这一点(在我写这篇文章的时候,有人发布了一个我还没有看过的方法)。我敢打赌,这里有一种方法涉及最低限度更改您的代码:

\documentclass{article}
%\url{http://tex.stackexchange.com/q/29745/86}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[scale = 4]
\clip (-0.2, -0.2) rectangle (1.2,1.2);
\begin{scope}[even odd rule]
\clip (0,0) -- (0.9772,0) arc (0:90:0.9772) -- cycle;
\clip (1,1) -- (0.0228,1) arc (180:270:0.9772) -- cycle;
\fill [fill = green] (0,0) rectangle (1,1);
\end{scope}
\begin{scope}[even odd rule]
\clip (1,0) -- (1,0.9772) arc (90:180:0.9772) -- cycle;
\clip (0,1) -- (0,0.0228) arc (270:360:0.9772) -- cycle;
\fill [fill = green] (0,0) rectangle (1,1);
\end{scope}
\draw [very thick](0,0) rectangle (1,1);
\draw [very thin] (0.9772,0) arc (0:90:0.9772);
\draw [very thin] (1,0.9772) arc (90:180:0.9772);
\draw [very thin] (0.0228,1) arc (180:270:0.9772);
\draw [very thin] (0,0.0228) arc (270:360:0.9772);
\end{tikzpicture}
\end{document}

就我个人而言,我会选择在角落处画圆,因为这样更容易正确绘制,以后还可以更改半径。以下是示例:

\documentclass{standalone}
%\url{http://tex.stackexchange.com/q/29745/86}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[scale = 4,every circle/.style={radius=0.9772}]
\useasboundingbox (-0.2, -0.2) rectangle (1.2,1.2);
\begin{scope}[even odd rule]
\clip (0,0) circle;
\clip (1,1) circle;
\fill [fill = green] (0,0) rectangle (1,1);
\end{scope}
\begin{scope}[even odd rule]
\clip (1,0) circle;
\clip (0,1) circle;
\fill [fill = green] (0,0) rectangle (1,1);
\end{scope}
\path [preaction={draw,very thick},clip] (0,0) rectangle (1,1);
\draw [very thin] (0,0) circle;
\draw [very thin] (1,1) circle;
\draw [very thin] (0,1) circle;
\draw [very thin] (1,0) circle;
\end{tikzpicture}
\end{document}

请注意,这里需要第一个剪辑来设置边界框(事实上,我已将其从 a 转换\clip为 a \useasboundingbox),否则在计算最终绘图的大小时会考虑圆圈(还有其他方法可以解决这个问题)。我喜欢这个解决方案的一点是,我可以通过仅更改一个参数来更改半径。

两者都产生:

填充路口

我相信这正是您想要的。

答案2

以下代码有效

 \begin{tikzpicture}[scale = 4]
 \draw [very thick](0,0) rectangle (1,1);
 \begin{scope}[fill = green]
    \clip (0,0) circle (0.9772);
    \fill (1,1) circle (0.9772);
 \end{scope}
 \begin{scope}[fill = green]
    \clip (1,0) circle (0.9772);
    \fill (0,1) circle (0.9772);
  \end{scope}
   \draw [very thin] (0.9772,0) arc (0:90:0.9772);
   \draw [very thin] (1,0.9772) arc (90:180:0.9772);
   \draw [very thin] (0.0228,1) arc (180:270:0.9772);
   \draw [very thin] (0,0.0228) arc (270:360:0.9772);
   \end{tikzpicture}

我尝试使用arc,但它不起作用,然后我尝试使用circle并且它起作用了。在此处输入图片描述

我希望这能对你有帮助。

相关内容