TikZ:使用 \foreach 构建封闭路径

TikZ:使用 \foreach 构建封闭路径

使用 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

你应该知道foreachbody 是按组执行的{...}。所以这让一切都变得棘手。为了避免这个问题,你可以使用另一个循环,例如\xintForxinttools库中循环。或者你可以用一种棘手的方式来做到这一点:

\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并画两次第一段。但在这种情况下,一开始会有一些小问题 :(

相关内容