![Tikz 使用 foreach 循环绘制形状](https://linux22.com/image/409986/Tikz%20%E4%BD%BF%E7%94%A8%20foreach%20%E5%BE%AA%E7%8E%AF%E7%BB%98%E5%88%B6%E5%BD%A2%E7%8A%B6.png)
我有一个形状绘制模板,可以根据形状的边数绘制形状顶点的坐标。但是,对于边数很多的形状,必须输入 (a1)-(a2) 等等,这有点繁琐,所以我尝试使用 foreach 循环。例如
\draw
\foreach \s in {0,1,...,\m}
{
{(a\s)--
}
};
但这不起作用,当我看着它时我并不指望它会起作用,但我不知道该如何去做
这是我的代码:
,tex
\begin{tikzpicture}
\pgfmathsetmacro{\n}{15};
\pgfmathsetmacro{\angle}{360/\n};
\pgfmathsetmacro{\initialangle}{90+(\angle/2)(1-Mod(\n,2))};
\pgfmathsetmacro{\m}{\n-1};
\foreach \s in {0,1,...,\m}
{
\pgfmathsetmacro{\r}{\angle\s};
\coordinate (a\s) at (\initialangle+\r:3);
\draw (a\s) circle (0.1) node[above]{a\s};
}
\end{tikzpicture}
答案1
欢迎!您想要这样的东西吗?
\documentclass[tikz,border=3mm]{standalone}
\begin{document}
\begin{tikzpicture}
\pgfmathtruncatemacro{\n}{15};
\pgfmathsetmacro{\angle}{360/\n};
\pgfmathsetmacro{\initialangle}{90+(\angle/2)(1-Mod(\n,2))};
\pgfmathtruncatemacro{\m}{\n-1};
\foreach \s in {0,1,...,\m}
{
\pgfmathsetmacro{\r}{\angle*\s};
\coordinate (a\s) at (\initialangle+\r:3);
\draw (a\s) circle[radius=0.1] node[above]{a\s};
}
\draw (a0)
foreach \s in {1,...,\m}{-- (a\s)} -- cycle;
\end{tikzpicture}
\end{document}
这里我对第 0 个坐标进行了不同的处理,将其改为\pgfmathsetmacro
有利\pgfmathtruncatemacro
的位置,并添加了乘号*
和-- cycle
。
您可能想让它变得更美观一些。
\documentclass[tikz,border=3mm]{standalone}
\begin{document}
\begin{tikzpicture}
\pgfmathtruncatemacro{\n}{15};
\pgfmathsetmacro{\angle}{360/\n};
\pgfmathsetmacro{\initialangle}{90+(\angle/2)(1-Mod(\n,2))};
\pgfmathtruncatemacro{\m}{\n-1};
\path foreach \s in {0,1,...,\m}
{
({\initialangle+\angle*\s}:3)
node[circle,inner sep=0.5mm,draw,label={[circle,anchor={180+\initialangle+\angle*\s}]$a_{\s}$}]
(a\s) {}
};
\draw foreach \s [remember=\s as \lasts (initially \m)]
in {0,1,...,\m} { (a\lasts)-- (a\s)};
\end{tikzpicture}
\end{document}
当然,还有更多的方法可以做到这一点,包括图形绘制库(例如,参见 pgfmanual v3.1.5 第 274 页上部的示例)、链(参见 pgfmanual v3.1.5 第 604 页的示例)或让连接形成一个圆圈。