使用 tikz 以编程方式构建封闭路径很容易:
\path (a0) \foreach \i in {1, ..., 7} {-- (a\i)} -- cycle;
但它强制挑出第一点。 tikz 拒绝反转构造模式:
\path \foreach \i in {0, ..., 7} {(a\i) --} cycle;
我认为这是有充分理由的(我在 SE 上读到了关于此问题的解释,但已经找不到该答案了,编辑找到了这里)。
不幸的是,如果构建模式比逐点添加更复杂,那么解决方案可能会非常繁琐:
\path \foreach \i in {0, ..., 8} {(a\i) -- (\i*10:3) -- (b\i) --} cycle;
这是一种非常紧凑的方法,但是为了让它工作,我需要编写代码:
\path (a0) -- (0:3) -- (b0) \foreach \i in {0, ..., 8} {-- (a\i) -- (\i*10:3) -- (b\i)} -- cycle;
这甚至不是一个复杂的计算。
是否存在某种魔法能让我仅使用 就能构建整个路径\foreach
?
编辑:此类构造的示例
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\fill[gray, rounded corners=25pt, even odd rule] (30:5) -- (120:3) -- (0:4) \foreach \i in {1, ...,19} {-- (30+18*\i:5) -- (120+18*\i:3) -- (18*\i:4)} -- cycle;
\end{tikzpicture}
\end{document}
答案1
如果你不介意添加一些如果,你可以把缺失的部分放在--
这里和那里
\begin{tikzpicture}
\fill[gray, rounded corners=25pt, even odd rule] \foreach \i in {0,...,19} {
\pgfextra{\ifnum\i=0\relax\else--\fi}
(30+18*\i:5) -- (120+18*\i:3) -- (18*\i:4)
\pgfextra{\ifnum\i=0\relax--\fi}
} -- cycle;
\end{tikzpicture}
实际上,你可以进一步缩短它们,但要点是一样的。
答案2
你应该知道foreach
body 是按组执行的{...}
。所以这让一切都变得棘手。为了避免这个问题,你可以使用另一个循环,例如\xintFor
从xinttools
库中循环。或者你可以用一种棘手的方式来做到这一点:
\documentclass[border=7mm]{standalone}
\usepackage{tikz}
\begin{document}
\def\segment{(30:5) -- (120:3) -- (0:4)}
\begin{tikzpicture}
\fill[gray, rounded corners=25pt, even odd rule]
\segment foreach \i in {0,...,20} {[rotate=\i*18] -- \segment} -- cycle;
\end{tikzpicture}
\end{document}
笔记:如果你想画它,你可以从 开始1
,但如果你想用 填充它even odd rule
,看起来你必须从 开始0
并画两次第一段。但在这种情况下,一开始会有一些小问题 :(