![在 foreach 循环中命名坐标](https://linux22.com/image/244787/%E5%9C%A8%20foreach%20%E5%BE%AA%E7%8E%AF%E4%B8%AD%E5%91%BD%E5%90%8D%E5%9D%90%E6%A0%87.png)
我遇到了以下问题:我正在使用beamer
和tikz
,我想在几张幻灯片上显示的绘图中使用一些随机点。如果我使用正常的随机方法,这些点会在每张幻灯片之后重新生成,具有我不想要的不同坐标:
\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}