我正在绘制一个由刚性“分子”组成的表面,每个分子由三个球体组成。我想给表面添加一些随机性。我创建了以下代码:
\begin{tikzpicture}
\def\nuPi{3.1459265}
\foreach \i in {11,10,...,0}{
\foreach \j in {5,4,...,0}{
\def\dx{rand*0.1}
\def\dy{rand*0.1}
\shade[ball color=red] (\i+\dx,{0.5*\j+\dy+0.4*sin(\i*\nuPi*10)}) circle(0.45);
\shade[ball color=gray] (\i+\dx,{0.5*\j+\dy+0.4*sin(\i*\nuPi*10)-0.9}) circle(0.45);
\shade[ball color=gray] (\i+\dx,{0.5*\j+\dy+0.4*sin(\i*\nuPi*10)-1.8}) circle(0.45);
}
}
\end{tikzpicture}
根据结果表面判断,\dx
和\dy
是在每次访问时生成的,而不是在每个循环中生成一次。有没有办法存储它们?
答案1
您可以使用 存储结果\pgfmathsetmacro{<macro>}{<expression>}
。请注意,像 这样的函数的参数sin(<arg>)
默认应以度为单位。如果不是,则应使用“r
运算符”。有关解析数学表达式的更多信息,请阅读部分63 数学表达式的语法(第 527 页起)tikz
/pgf
文档。
我已将您的代码片段修改为 MWE,并使用(\xcoor
,\ycoor
)来表示坐标对,因为它们对于三个阴影球基本相同。
\documentclass{article}
\usepackage{tikz}% http://ctan.org/pkg/pgf
\begin{document}
\begin{tikzpicture}
\foreach \i in {0,1,...,11}{
\foreach \j in {5,4,...,0}{
\pgfmathsetmacro{\xcoor}{\i+rand*0.1}% x-coordinate
\pgfmathsetmacro{\ycoor}{0.5*\j+rand*0.1+.4*sin(\i*360/12)}% y-coordinate
\shade[ball color=red] (\xcoor,\ycoor) circle(0.45);
\shade[ball color=gray] (\xcoor,\ycoor-0.9) circle(0.45);
\shade[ball color=gray] (\xcoor,\ycoor-1.8) circle(0.45);
}
}
\end{tikzpicture}
\end{document}