了解绘制(不规则)圆的宏

了解绘制(不规则)圆的宏

我正在尝试理解代码回答关于绘制封闭路径,以便我能够进一步操作它。以下是其中的一小部分:

\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections,calc}
\usetikzlibrary{decorations.pathreplacing,decorations.markings}

% decorating every segment of a path
% https://tex.stackexchange.com/a/69225
\tikzset{
  % style to apply some styles to each segment of a path
  on each segment/.style={
    decorate,
    decoration={
      show path construction,
      moveto code={},
      lineto code={
        \path [#1]
        (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);
      },
      curveto code={
        \path [#1] (\tikzinputsegmentfirst)
        .. controls
        (\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
        ..
        (\tikzinputsegmentlast);
      },
      closepath code={
        \path [#1]
        (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);
      },
    },
  },
  % style to add an arrow in the middle of a path
  mid arrow/.style={postaction={decorate,decoration={
        markings,
        mark=at position .5 with {\arrow[#1]{stealth}}
      }}},
}

\newcommand\irregularcircle[2]{% radius, irregularity
  \pgfextra {\pgfmathsetmacro\len{(#1)+rand*(#2)}}
  +(0:\len pt)
  \foreach \a in {10,20,...,350}{
    \pgfextra {\pgfmathsetmacro\len{(#1)+rand*(#2)}}
    -- +(\a:\len pt)
  } -- cycle
}

\begin{document}
\begin{tikzpicture}
  % Set the seed for the random function to a fixed value to get
  % the same picture at every run
  \pgfmathsetseed{12345}
  \coordinate (c) at (0,0);
  \draw[blue,rounded corners=1mm] (c) \irregularcircle{3cm}{1.5mm};
  \draw[red,rounded corners=1mm] (c) \irregularcircle{1cm}{1.5mm};

\end{tikzpicture}
\end{document}

在此处输入图片描述

我不明白以下宏的含义:

\newcommand\irregularcircle[2]{% radius, irregularity
  \pgfextra {\pgfmathsetmacro\len{(#1)+rand*(#2)}}
  +(0:\len pt)
  \foreach \a in {10,20,...,350}{
    \pgfextra {\pgfmathsetmacro\len{(#1)+rand*(#2)}}
    -- +(\a:\len pt)
  } -- cycle
}

Tikz-pfg 手册

...此操作(\pgfextra)仅应由真正的专家使用,并且仅应在巧妙的宏内部深处使用,而不能在正常路径上使用。

有人可以解释一下宏定义中的每一行是如何\irregularcircle工作的吗?

答案1

\irregularcircle宏假定当前点是不规则圆的中心。由于 符号,该宏计算出的点都是相对于该中心的+(...)

\pgfextra(或操作)允许暂时中断当前路径来评估任何代码(或者,如 pgfmanual 中所述,“做一些计算或其他事情”)。

在这种特殊情况下,对于当前版本的 TikZ/pgf,该\pgfextra操作实际上没有必要。我可以编写以下宏:

\newcommand\irregularcircle[2]{% radius, irregularity
  +(0:{(#1)+rand*(#2)})
  \foreach \a in {10,20,...,350}{
    -- +(\a:{(#1)+rand*(#2)})
  } -- cycle
}

{...}坐标中包含的计算的括号允许在该计算中使用圆括号。

更简单的版本可能是:

\newcommand\irregularcircle[2]{% radius, irregularity
  +(0:#1+rand*#2)
  \foreach \a in {10,20,...,350}{
    -- +(\a:#1+rand*#2)
  } -- cycle
}

但在这种情况下,两个参数的数值已经不能是任何计算,而只是简单的数值。

相关内容