![为什么在之前的循环中给出的绘图命令完全相同的重复](https://linux22.com/image/396300/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8%E4%B9%8B%E5%89%8D%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%B8%AD%E7%BB%99%E5%87%BA%E7%9A%84%E7%BB%98%E5%9B%BE%E5%91%BD%E4%BB%A4%E5%AE%8C%E5%85%A8%E7%9B%B8%E5%90%8C%E7%9A%84%E9%87%8D%E5%A4%8D.png)
问题。为什么下面的代码会生成一条从顶点 0 到顶点 1 的线不是是否与之前绘制的类似线(通过 foreach 循环)完全重合?
\begin{tikzpicture}
\foreach \n/\a/\r in {0/0/100,1/72/100,2/144/100,3/216/100,4/288/100}{
\node (v\n) at (\a:\r pt) []{};
}
\foreach \n in {0,1,2,3,4}{
\pgfmathsetmacro\auxone{Mod(\n,5)};
\pgfmathsetmacro\auxtwo{Mod(add(\n,1),5)};
\pgfmathsetmacro\auxthree{Mod(add(\n,2),5)};
\draw[opacity=0.5] (v\auxone)--(v\auxtwo);
\draw[opacity=0.5] (v\auxthree)--(v\auxone);
}
\draw[opacity=0.5] (v0)--(v1);
\end{tikzpicture}
有问题的输出如下:
评论。
我希望第二条线从 0 到 1 与之前绘制的线完全重合(并因此由于两条不透明度为 0.5 的线的叠加而产生更深的色调)。
我看不出这两条线不一致的任何原因。(如果在心里代入变量 \auxone 和 \auxtwo,那么这两个绘图命令在我看来完全相同,因此可以预期会产生完全相同的效果。)
我尝试换线
\draw[opacity=0.5] (v0)--(v1);
与线
\draw[opacity=0.5] (v0.center)--(v1.center);
产生了一个略有不同但仍然无法解释且不受欢迎的结果,我允许自己重现这个结果(希望这可以帮助某人理解这个问题):
答案1
因为您使用的是\pgfmathsetmacro
,它会.0
在数字末尾添加,这些数字会被解释为锚点(在本例中.0
相当于)。如果您改用,线条将完美匹配,正如它们应该的那样。.east
\pgfmathtruncatemacro
\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \n/\a/\r in {0/0/100,1/72/100,2/144/100,3/216/100,4/288/100}{
\node (v\n) at (\a:\r pt) []{};
}
\foreach \n in {0,1,2,3,4}{
\pgfmathtruncatemacro\auxone{Mod(\n,5)};
\pgfmathtruncatemacro\auxtwo{Mod(add(\n,1),5)};
\pgfmathtruncatemacro\auxthree{Mod(add(\n,2),5)};
\draw[opacity=0.5] (v\auxtwo)--(v\auxone);
\draw[opacity=0.5] (v\auxthree)--(v\auxone);
}
\draw[opacity=0.5] (v0)--(v1);
\end{tikzpicture}
\end{document}
如果您想缩小差距,您可能需要使用coordinate
s 而不是node
s。
\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \n/\a/\r in {0/0/100,1/72/100,2/144/100,3/216/100,4/288/100}{
\coordinate (v\n) at (\a:\r pt);
}
\foreach \n in {0,1,2,3,4}{
\pgfmathtruncatemacro\auxone{Mod(\n,5)};
\pgfmathtruncatemacro\auxtwo{Mod(add(\n,1),5)};
\pgfmathtruncatemacro\auxthree{Mod(add(\n,2),5)};
\draw[opacity=0.5] (v\auxtwo)--(v\auxone);
\draw[opacity=0.5] (v\auxthree)--(v\auxone);
}
\draw[opacity=0.5] (v0)--(v1);
\end{tikzpicture}
\end{document}