使用 pgfsetmacro 在 foreach 循环中绘制路径

使用 pgfsetmacro 在 foreach 循环中绘制路径

我有一个圆上的 N 个点,我想绘制所有 Nk 个连续点集的凸包的交点。

这些点的间距并不均匀。N 和 k 的值(以及每个点的实际角度)会发生变化,因此我宁愿不使用硬编码解决方案。

这是我能想到的最好的办法。这个愚蠢的方法完全符合我的要求,但每次都需要进行大量的剪切粘贴。我不明白为什么第二种方法会失败;我读到过 \foreach 循环中的变量并不完全像变量那样运行(我认为),但我找不到解决这个问题的方法。

\documentclass{article}
\usepackage{tikz}


\begin{document}

\begin{tikzpicture}[every node/.style={draw,inner sep=0mm}]

  \def\rad{5cm}
  \def\k{2}
  \def\N{6}


  \node (x1) at (15:\rad) {} ;
  \node (x2) at (45:\rad) {} ;
  \node (x3) at (90:\rad) {} ;
  \node (x4) at (120:\rad) {} ;
  \node (x5) at (210:\rad) {} ;
  \node (x6) at (270:\rad) {} ;


  %%% draw all the lines from xi to x(i+k)
  \foreach \i in {1,2,3,4,5,6} {
    \pgfmathtruncatemacro{\j}{1+mod(\i-1+\k,6)}
    \draw (x\i) -- (x\j) ;
  }


  %%% draw the intersection of all convex hulls of 5 consecutive points among the six
  %%% this is a silly way
  \clip (x1.center) -- (x2.center) -- (x3.center) -- (x4.center) -- (x5.center) -- cycle ;
  \clip (x2.center) -- (x3.center) -- (x4.center) -- (x5.center) -- (x6.center) -- cycle ;
  \clip (x3.center) -- (x4.center) -- (x5.center) -- (x6.center) -- (x1.center) -- cycle ;
  \clip (x4.center) -- (x5.center) -- (x6.center) -- (x1.center) -- (x2.center) -- cycle ;
  \clip (x5.center) -- (x6.center) -- (x1.center) -- (x2.center) -- (x3.center) -- cycle ;
  \fill (x6.center) -- (x1.center) -- (x2.center) -- (x3.center) -- (x4.center) -- cycle ;



  %%% draw the intersection of all convex hulls of N-k+1 consecutive points among the N
  %%% this is the code I think should work but doesn't
  %%% error message: ! Package tikz Error: Giving up on this path. Did you forget a semicolon?.
  \foreach \a in {1,...,\N}{
    \pgfmathsetmacro{\b}{1+mod(\a+\k,\N)}
    \draw (x\a) -- (x\b)
    \foreach \x in {\k,...,\N} {
      \pgfmathtruncatemacro{\xp}{1+mod(\a+\x-1,\N)}
      \pgfmathtruncatemacro{\xq}{1+mod(\a+\x,\N)}
      (x-\xp) -- (x-\xq)
    } ;
  }

\end{tikzpicture}


\end{document}

答案1

您需要在 foreach 的每次旋转中完成完整的、有效的语法路径。此外,您不能在解析路径命令时立即进行计算。您需要将它们埋在里面\pgfextra{}以暂停解析并执行其他操作。

因此这里仅需要进行以下更改;

  \foreach \a in {1,...,\N}{
    \draw\pgfextra{\pgfmathsetmacro{\b}{1+mod(\a+\k,\N)}}
     (x\a) -- (x\b)
    \foreach \x in {\k,...,\N} {
      \pgfextra{\pgfmathtruncatemacro{\xp}{1+mod(\a+\x-1,\N)}
      \pgfmathtruncatemacro{\xq}{1+mod(\a+\x,\N)}}
      (x\xp) -- (x\xq)
    };
  }

在此处输入图片描述

但我不知道这是否是预期的结果。

相关内容