制作动画(这里),我使用了一个找到的代码(此处:@Jake 回答)。它有效,但并非对所有增量都有效。当增量为 0.02 到 0.02 时有效,但当增量为 0.04 到 0.04、0.05 到 0.05 或 0.1 到 0.1 时无效。
此处增量为 0.04,动画并未完成转动:
这里,增量为 0.02,动画完成转动但路径未闭合:
第一个问题:
- 为什么它不适用于任何增量?
- 我怎样才能使装饰适用于任意增量?
版本:通过增量替换\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}{%
。
是的,这条路的尽头确实封闭了。
編輯:我简化了代码,删除了\typeout
s。