我正在尝试理解代码回答关于绘制封闭路径,以便我能够进一步操作它。以下是其中的一小部分:
\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
}
...此操作(
\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
}
但在这种情况下,两个参数的数值已经不能是任何计算,而只是简单的数值。