我正在尝试链接多条贝塞尔曲线,但当我尝试填充它们时,我无法填充完整的闭合曲线,但它似乎在填充之前关闭了每条中间曲线。我尝试了各种方法,但似乎都没有用。可能很简单……应该很明显我不想要以下
我只是“链接”了路径……如果我不链接它们,也会发生同样的结果。
(P1) .. controls (C1) and (C2) .. (P2) (P2) .. controls (C2) and (C3) .. (P3) ...
答案1
不要重复每个路径段的最后一个坐标。
逐字摘自pgfmanual
,第 14.3 节“曲线至操作”:
与直线至操作一样,两条曲线是否连接在一起,是因为它们是由连续的曲线至或直线至操作产生的,还是它们恰好有相同的结尾,这都是有区别的:
\begin{tikzpicture}[line width=10pt]
\draw (0,0) -- (1,1) (1,1) .. controls (1,0) and (2,0) .. (2,0);
\draw (3,0) -- (4,1) .. controls (4,0) and (5,0) .. (5,0);
\useasboundingbox (0,1.5); % make bounding box higher
\end{tikzpicture}
这对于填充很重要,因为当 PGF 遇到像原始曲线一样的分段曲线并被要求填充它时,它会分别填充每个部分,而当它填充开放曲线时,它会先用从终点到起点的直线将其闭合。因此得到了问题中看到的结果。
答案2
只是为了完善杰克的出色回答。首先,问题不仅出现在贝塞尔曲线上,而且正如杰克所说,线到线或操作to
是edge
一种特殊情况。
第一个问题是线条如何连接,第二个问题是填充什么区域。
问题并不完全与不连续的线有关(参见最后一个例子。我们有两条路径和两条连续的线。使用 tikz 时,当您不链接绘制操作时,但是当您给出一个新点时,您会进行“移动到”操作并开始一条新路径,如果您在命令中line to
给出了一个,那么当代码到达末尾时,所有封闭的路径都将被填充。fill option
draw
;
我在第一个例子中使用了 'to' 操作来展示fill
和的不同问题joint
。
我给出了两个带有边缘的例子,因为在这种情况下,您会得到多条路径并且无法填充。(有关edge
操作的详细信息,请参阅 pgfmanual)。
\documentclass[11pt]{scrartcl}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{%
arrows,
calc
}
\begin{document}
\tikz \fill[yellow,line width=1mm,draw=black,line join=round]
(0:0) to [bend left] (0:3)
to [bend left] (-60:3)
to [bend left] (0:0) --cycle ;
\tikz \fill[yellow,line width=1mm,draw=black,line join=round]
(0:0) to [bend left] (0:3)
to [bend left] (-60:3)
to [bend left] (0:0) ;
\tikz \fill[yellow,line width=1mm,draw=black]
(0:0) to [bend left] (0:3)
(0:3) to [bend left] (-60:3)
(-60:3) to [bend left] (0:0) ;
\tikz \fill[yellow,line width=1mm,draw=black,line join=round]
(0:0) to [bend left] (0:3)
(0:3) edge [bend left] (-60:3)
(-60:3) edge [bend left] (0:0) ;
\tikz \fill[yellow,line width=1mm,draw=black,line join=round]
(0:0) to [bend left] (0:3)
edge [bend left] (-60:3)
edge [bend left] (0:0) -- cycle ;
\tikz \fill[yellow,line width=1mm,draw=black,line join=round]
(0:0) -- (0:3)
(0:3) -- (-60:3)
(-60:3) -- (0:0) -- cycle ;
\tikz \fill[yellow,line width=1mm,draw=black,line join=round]
(0:0) -- (0:3)
-- (-60:3)
-- (0:0)
-- cycle
[shift={(4,0)} ]
(0:0) -- (0:3)
-- (-60:3)
-- (0:0)
-- cycle
;
\end{document}
最后的例子展示了如何填充(这里是阴影,但这是同一个问题)多个路径。有时得到你想要避免的东西很有趣。这是一个工作,insert path
但很容易避免这个选项。您可以使用
\draw[\st] \foreach \a in {0,10,...,350} {(\a:2) to [bend left](1,0) to [bend left] (\a:2) };
代替
\draw[\st] \foreach \a in {0,10,...,350} {(\a:2) coordinate (a) [curve 1] };
在最后这些例子中,我展示了不同路径之间的差异。我先使用两个to
操作,然后使用to
和,edge
但我用第一个点给出了多条路径(\a:2)
。
\documentclass[11pt]{scrartcl}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{%
arrows,
calc
}
\begin{document}
\tikzset{curve 1/.style={insert path={to [bend left](1,0) to [bend left] (\tikzlastnode)}}}
\tikzset{curve 2/.style={insert path={to [bend left](1,0) edge [bend left] (\tikzlastnode)}}}
\tikzset{main/.style={top color=red!50,bottom color=orange}}
\tikzset{top/.style={black,even odd rule,bottom color=MidnightBlue,top color=green}}
\begin{tikzpicture} [rotate=-90,scale=1.5]
\foreach \st in {main,top}
\draw[\st] \foreach \a in {0,10,...,350} {(\a:2) coordinate (a) [curve 1] };
\end{tikzpicture}
\begin{tikzpicture} [rotate=-90,scale=1.5]
\foreach \st in {main,top}
\draw[\st] \foreach \a in {0,10,...,350} {(\a:2) coordinate (a) [curve 2] };
\end{tikzpicture}
\end{document}