TikZ 命令以长度作为参数

TikZ 命令以长度作为参数

我正在尝试绘制正多边形,但我希望边数和外接圆半径都是绘制该多边形的命令的参数。这是我的 MnWE:

\documentclass[tikz,border=1.5cm]{standalone}


\newcommand\polygon[3][]{
%   \pgfmathsetlength{\len}{#3}% Third argument with units.
    \pgfmathsetlength{\len}{+ #3 cm}% Third argument with units.
%   \pgfmathsetmacro{\len}{#3}% Add cm or other unit when using.
    \pgfmathsetmacro{\angle}{360/#2}
    \pgfmathsetmacro{\edge}{-90+\angle}
    \begin{scope}[#1]
        \foreach \i in {0,1,2,...,#2} {
            \pgfmathsetmacro{\t}{\edge + \angle*\i}
            \draw (\t:\len cm) --
    }
    -- cycle;
    \end{scope}
}

\begin{document}

\begin{tikzpicture}[opacity=0.8]
  \polygon{5}{1}
\end{tikzpicture}

\end{document}

我收到以下错误:

! Package tikz Error: Cannot parse this coordinate.See the tikz package documentation for explanation.Type H <return> for immediate help.... \polygon{5}{1}
! Package tikz Error: Giving up on this path. Did you forget a semicolon?.See the tikz package documentation for explanation.Type H <return> for immediate help.... \polygon{5}{1}

实际上,我在 TeXMaker 的日志消息窗口中看到了 6 次相同的行。我尝试使用注释行代替未注释行,但没有任何效果。

那么我的问题是如何将我想要的长度传递给这个命令。我尝试过传递这个参数,带单位和不带单位,以及带和不带手册第 1027 页推荐的 + 号(我使用的是 3.1.5b 版)。即使我修复了长度并只为 2 个参数定义命令,代码也不起作用;也就是说,如果\len我直接使用1cm并将命令定义为只有 2 个参数,代码也无法工作。我是否缺少一个库或一个额外的包来与 `\pgfmathsetmacro`` 命令一起使用?提前致谢!

答案1

主要问题是\foreach循环启动了多条未完成的路径。如果修复了这个问题,就会得到一个多边形。

\documentclass[tikz,border=1.5cm]{standalone}


\newcommand\polygon[3][]{
   \pgfmathsetmacro{\len}{#3}% Add cm or other unit when using.
    \pgfmathsetmacro{\angle}{360/#2}
    \pgfmathsetmacro{\edge}{-90+\angle}
    \begin{scope}[#1]
       \draw  (\edge:\len) 
       foreach \i in {1,2,...,\the\numexpr#2-1} {
            %\pgfmathsetmacro{\t}{\edge + \angle*\i}
            -- (\edge + \angle*\i:\len)
    }
    -- cycle;
    \end{scope}
}

\begin{document}

\begin{tikzpicture}[opacity=0.8]
  \polygon{5}{1}
\end{tikzpicture}

\end{document}

在此处输入图片描述

当然,还有更简单的方法来绘制多边形,例如使用shapes.geometric库。你也不需要任何这些\pgfmathsetmacro。Ti无论如何,Z 都会解析坐标。

\documentclass[tikz,border=1.5cm]{standalone}


\newcommand\polygon[3][]{
    \begin{scope}[#1]
       \draw  (-90+360/#2:#3) 
       foreach \i in {1,2,...,\the\numexpr#2-1} {
            -- (-90+360/#2 +\i*360/#2:#3)
    }
    -- cycle;
    \end{scope}
}

\begin{document}

\begin{tikzpicture}[opacity=0.8]
  \polygon{5}{1}
\end{tikzpicture}

相关内容