在 foreach 循环中命名坐标

在 foreach 循环中命名坐标

我遇到了以下问题:我正在使用beamertikz,我想在几张幻灯片上显示的绘图中使用一些随机点。如果我使用正常的随机方法,这些点会在每张幻灯片之后重新生成,具有我不想要的不同坐标:

\foreach \x in {1/6,3/6,5/6}
  \foreach \y in {1/6,3/6,5/6}
    \draw[fill,scale=1] ($ (\x,\ y) + 1/10 * (rand, rand) $)
      \coordinate ( \x\y ) node[circle, fill, inner sep=1pt] {};

显然我需要以某种方式保存坐标以供日后使用。我认为我可以使用 for 循环声明坐标来实现这一点:

\foreach \x in {1/6,3/6,5/6}
  \foreach \y in {1/6,3/6,5/6}
    \coordinate( \x\y ) at ($ (\x,\ y) + 1/10 * (rand, rand) $);

这似乎有效,但以后我无法访问坐标:

\foreach \x in {1/6,3/6,5/6}
  \foreach \y in {1/6,3/6,5/6}
    \draw[fill,scale=1] ( \x\y )
      \coordinate ( \x\y ) node[circle, fill, inner sep=1pt] {};

这段代码给了我错误:“没有名为 1/61/6 的形状。”

我不知道我是否以正确的方式处理此事,我将非常感谢任何帮助。

答案1

您的代码中存在一些错误/怪癖:在第一个示例中,您使用了不正确的语法\draw ... \coordinate。您应该使用(请注意之前\draw ... coordinate缺少的)。\coordinate

此外,在第一个代码片段中,您\draw没有使用任何绘图命令,而是使用node。从技术上讲,这是可以的,但您实际上应该使用\path ... node,或者只是\draw ... circle\fill ... circle命令。我建议您使用\fill ... circle,因为node如果您只需要小圆圈,那么它有点太强大了。

此外, 中有一个虚假的空格\ y。 中的因子和坐标之间也不应该有空格($ (\x,\y) + 1/10 * (rand, rand) $)。 通常,您必须小心使用空格:命名坐标时,空格很重要:\coordinate ( A )与 不同\coordinate (A)。 更正所有这些问题后,您的第一个代码片段(第一次绘制圆并保存其坐标)可能如下所示:

\foreach \x in {1/6,3/6,5/6}
  \foreach \y in {1/6,3/6,5/6}
    \fill ($ (\x,\y) + 1/10*(rand, rand) $) circle [radius=1pt] coordinate   (\x\y);

然后你可以稍后使用

\foreach \x in {1/6,3/6,5/6}
  \foreach \y in {1/6,3/6,5/6}
    \fill  (\x\y) circle [radius=1pt];

这是一个完整的例子(使用像这样的完整例子发布问题通常是一个好主意,因为这样可以更容易地发现错误):

\documentclass{beamer}

\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\begin{frame}{One}
\begin{tikzpicture}
\foreach \x in {1/6,3/6,5/6}
  \foreach \y in {1/6,3/6,5/6}
    \fill ($ (\x,\y) + 1/10*(rand, rand) $) circle [radius=1pt] coordinate   (\x\y);
\end{tikzpicture}
\end{frame}

\begin{frame}{Two}
\begin{tikzpicture}
\foreach \x in {1/6,3/6,5/6}
  \foreach \y in {1/6,3/6,5/6}
    \fill  (\x\y) circle [radius=1pt];
\end{tikzpicture}
\end{frame}

\end{document}

或者,您可以设置 来设置随机数生成器的种子,而不是保存坐标\pgfmathsetseed{<integer>}。这样做还有一个好处,您可以尝试不同的种子值,找到能产生最佳/“最随机”模式且可重现的值。

\documentclass{beamer}

\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}



\begin{frame}{One}
\begin{tikzpicture}
\pgfmathsetseed{1}
\foreach \x in {1/6,3/6,5/6}
  \foreach \y in {1/6,3/6,5/6}
    \fill ($ (\x,\y) + 1/10*(rand, rand) $) circle [radius=1pt] ;
\end{tikzpicture}
\end{frame}

\begin{frame}{Two}
\begin{tikzpicture}
\pgfmathsetseed{1}
\foreach \x in {1/6,3/6,5/6}
  \foreach \y in {1/6,3/6,5/6}
    \fill ($ (\x,\y) + 1/10*(rand, rand) $) circle [radius=1pt] ;
\end{tikzpicture}
\end{frame}

\end{document}

相关内容