rounded corners
这是 TikZ 中的一个已知问题,当使用该选项的值大于两个角之间距离的一半时,就会引入伪影(例如圆角的动态半径)。现在考虑以下 MWE。
\documentclass[border=1cm]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[scale=5]
\draw[rounded corners=20pt] (0,-1) to[out=110,in=-110] (0,1) to[out=-70,in=70] cycle;
\end{tikzpicture}
\end{document}
此代码绘制的路径包含两个角,除了其中一个角恰好也是路径的起点和终点外,其他方面都相同。如果不使用圆角,它看起来如下所示:
但不幸的是,当我们引入该rounded corners
选项时,生成的图片却出现了熟悉的瑕疵:
我猜想使用cycle
来闭合路径的行为并不像我想象的那样。也就是说,我期望cycle
基本上合并路径的起点和终点,从而在这个合并点处只创建一个角。相反,它似乎表现得好像那里有两个角,彼此之间的距离为零,使得任何非零圆角半径都太大。
我想出了两个解决方法(请参阅下面的代码):
- 使用不同的起点/终点。(例如,两个角中间的切线垂直的点之一。)这是可能的,但只有当您完全正确地获得该点时,它才会看起来正确,并且您需要为
rounded corners
每个角单独指定选项。(使其成为全局draw
选项会像以前一样在起点/终点引入伪影。) - 分割角。查看我对此解决方法的具体实施结果,似乎问题与功能关系不大,
cycle
而与操作的in
和out
选项关系很大to
。因为此解决方法中的起点/终点仍然是一个角,这次确实可以正确圆角,并且与原始代码的唯一真正区别是与原始代码的-- cycle
相对。to[out=110,in=-90] cycle
这两种解决方法的代码和生成的图片如下所示。
那么我的问题是:我可以将/选项cycle
与操作结合使用,而不必将起点更改为我可能不知道的某个点吗?(显然,使用起点的副本而不是关键字并不能改善这里的情况,在这种情况下,第二个角不会被识别为一个角,甚至不会尝试舍入。)或者还有其他简单的方法来获取我想要的 TikZ 图片?in
out
to
rounded corners
cycle
% Start at one of the two points halfway between the corners
\begin{tikzpicture}[scale=5]
\draw (-0.22,0) to[out=90,in=-110,rounded corners=20pt] (0,1) to[out=-70,in=70,rounded corners=20pt] (0,-1) to[out=110,in=-90] cycle;
\end{tikzpicture}
% Introduce extra corners (split the original two)
\begin{tikzpicture}[scale=5]
\draw[rounded corners=2pt] (-0.02,-1) to[out=110,in=-110] (-0.02,1) -- (0.02,1) to[out=-70,in=70] (0.02,-1) -- cycle;
\end{tikzpicture}
Tarass 的回答(https://tex.stackexchange.com/a/302811/25596) 给了我一个可能的第三种解决方法的想法,即使用“热身”线和“冷却”线以及选项shorten
。但是,似乎shorten
和rounded corners
不能一起玩。
\begin{tikzpicture}[scale=5]
% Start point
\fill[green!80!black] (0.2,-1) circle (0.02cm);
% End point
\fill[blue!80!black] (-0.2,-1) circle (0.02cm);
% Shorten the start by 1cm, shorten the end by 0.2cm
\draw[rounded corners=20pt,shorten <=1cm,shorten >=0.2cm]
% "Warm-up"
(0.2,-1) -- (0,-1)
% Enter the path
to[out=110,in=-110] (0,1)
to[out=-70,in=70] (0,-1)
% Go around a second time, then exit the path
to[out=110,in=-110] (0,1)
to[out=-70,in=70] (0,-1)
% "Cool-down"
-- (-0.2,-1);
\end{tikzpicture}