![使用 TikZ 填充交叉口的问题](https://linux22.com/image/240931/%E4%BD%BF%E7%94%A8%20TikZ%20%E5%A1%AB%E5%85%85%E4%BA%A4%E5%8F%89%E5%8F%A3%E7%9A%84%E9%97%AE%E9%A2%98.png)
我试图使用 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.8
从0.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
并且它起作用了。
我希望这能对你有帮助。