TikZ 装饰:如何一点一点地绘制一条封闭的路径?

TikZ 装饰:如何一点一点地绘制一条封闭的路径?

制作动画(这里),我使用了一个找到的代码(此处:@Jake 回答)。它有效,但并非对所有增量都有效。当增量为 0.02 到 0.02 时有效,但当增量为 0.04 到 0.04、0.05 到 0.05 或 0.1 到 0.1 时无效。

此处增量为 0.04,动画并未完成转动:

动画-1

这里,增量为 0.02,动画完成转动但路径未闭合:

动画-2劣币

第一个问题:

  • 为什么它不适用于任何增量?
  • 我怎样才能使装饰适用于任意增量?

版本:通过增量替换\foreach不会\multido再造成任何问题,完整的转变就完成了。

\multido{\npos=0.00+0.05}{21}{
%\multido{\npos=0.00+0.04}{26}{
%\multido{\npos=0.00+0.1}{11}{
%\foreach \npos  in {0,.1,...,1}{% 
            \begin{tikzpicture}[scale=1]
                \fill[green!40](0,0) rectangle (4,4);
                \draw[start segment=\npos,blue,ultra thick] (0,0) -- (4,0) -- (4,4) -- (0,4) --cycle ;
            \end{tikzpicture} 
 } 

第 2 版:张瑞熙的解决方案 允许您使用循环绕行整个路径\foreach

%\foreach \x [evaluate =\x as \npos using \x/50] in {0,1,...,50}{% increment of 0.02
%\foreach \x [evaluate =\x as \npos using \x/25] in {0,1,...,25}{% increment of 0.04
\foreach \x [evaluate =\x as \npos using \x/10] in {0,1,...,10}{% increment of 0.1
            \begin{tikzpicture}[scale=1]
                \fill[green!40](0,0) rectangle (4,4);
                \draw[start segment=\npos,blue,ultra thick] (0,0) -- (4,0) -- (4,4) -- (0,4) --cycle ;
            \end{tikzpicture} 

第二个问题:

如何关闭路径?

\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{decorations}

\pgfdeclaremetadecoration{start}{initial}{
    \state{initial}[width={\pgfmetadecoratedpathlength*\pgfdecorationsegmentlength},next state=final]{
        \decoration{lineto}
    }
    \state{final}{}
}

\tikzset{start segment/.style={decoration={start,raise=2mm,segment length=#1},decorate}} 

\begin{document}
\foreach \rpos  in {0,.02,.04,...,1}{% 
            \begin{tikzpicture}[scale=1]
                \fill[green!40](0,0) rectangle (4,4);
                \draw[start segment=\rpos,blue,ultra thick] (0,0) -- (4,0) -- (4,4) -- (0,4) --cycle ;
            \end{tikzpicture} 
 } 
\end{document}
  • 我怎样才能彻底关闭它?

答案1

路径完成后,您必须关闭路径。(不幸的是,有一些舍入。这解释了为什么检查结果>0.999pt为 而不是=1pt。)可以检查\pgfkeys{/pgf/decoration automaton/if input segment is closepath=...}最后一段是否是闭合路径段,然后如果接近其末尾,则关闭路径。这避免了关闭不关闭的路径。请注意,这0.999pt是一个经验值。如果您有一条非常极端的路径,其中闭合路径段非常短,例如路径(0,0) -- (4,0) -- (4,4) -- (0,4) -- (0,0) --cycle ;,则此答案可能不起作用。

至于“任何增量”的问题:当然,如果您使用上面的方法并尝试\foreach \rpos in {0,.03,...,1} ...,那么轮廓将不会闭合。但是,这是因为您指示 TikZ 在最后一步绘制 99% 的路径,因为最后一步\rpos是此循环中的 0.99(大致)。TikZ 如何知道它应该闭合?在这种情况下,必须将闭合点添加到循环中并说\foreach \rpos in {0,.03,...,1,0.9999}

\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{decorations}
\pgfkeys{pgf/.cd,
close/.code={\pgfpathclose}}

\pgfdeclaremetadecoration{draw part of a path}{initial}{
    \state{initial}[width={\pgfmetadecoratedpathlength*\pgfdecorationsegmentlength},next state=final]{
        \decoration{lineto}
    }
    \state{final}{\ifdim\pgfdecorationsegmentlength>0.999pt
        \pgfkeys{/pgf/decoration automaton/if input segment is closepath=/pgf/close}
    \fi 
    }
}
%
\tikzset{start segment/.style={decoration={draw part of a path,raise=2mm,segment length=#1},decorate}} 

\begin{document}
\foreach \rpos  in {0,.03,...,1,0.9999}{% 
            \begin{tikzpicture}[scale=1]
                \fill[green!40](0,0) rectangle (4,4);
                \draw[start segment=\rpos,blue,ultra thick] (0,0) -- (4,0) -- (4,4) -- (0,4) --cycle ;
                \begin{scope}[xshift=5cm]
                \fill[red!40](0,0) rectangle (4,4);
                \draw[start segment=\rpos,blue,ultra thick] (0,0) -- (4,0) -- (4,4) -- (0,4);
                \end{scope}
            \end{tikzpicture} 
 } 
\end{document}

在此处输入图片描述

这对于 也有效\foreach \rpos in {0,.02,...,1,0.9999}{%

是的,这条路的尽头确实封闭了。

在此处输入图片描述

編輯:我简化了代码,删除了\typeouts。

相关内容