链接曲线时正确填充

链接曲线时正确填充

我正在尝试链接多条贝塞尔曲线,但当我尝试填充它们时,我无法填充完整的闭合曲线,但它似乎在填充之前关闭了每条中间曲线。我尝试了各种方法,但似乎都没有用。可能很简单……应该很明显我不想要以下

在此处输入图片描述

我只是“链接”了路径……如果我不链接它们,也会发生同样的结果。

(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

只是为了完善杰克的出色回答。首先,问题不仅出现在贝塞尔曲线上,而且正如杰克所说,线到线或操作toedge一种特殊情况。

第一个问题是线条如何连接,第二个问题是填充什么区域。

问题并不完全与不连续的线有关(参见最后一个例子。我们有两条路径和两条连续的线。使用 tikz 时,当您不链接绘制操作时,但是当您给出一个新点时,您会进行“移动到”操作并开始一条新路径,如果您在命令中line to给出了一个,那么当代码到达末尾时,所有封闭的路径都将被填充。fill optiondraw;

我在第一个例子中使用了 '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} 

在此处输入图片描述

相关内容