我制作了这个最小文件:
\documentclass{standalone}
\usepackage{tkz-base,tkz-euclide}
\begin{document}
\begin{tikzpicture}
\tkzInit[xmin=-8,xmax=8,ymin=-7,ymax=7]
\tkzGrid
\tkzAxeXY
\pgfmathsetmacro{\avect}{{int(rand * 8)}}
\pgfmathsetmacro{\bvect}{{int(rand * 8)}}
\pgfmathsetmacro{\cvect}{{int(rand * 8)}}
\pgfmathsetmacro{\dvect}{{int(rand * 8)}}
\pgfmathsetmacro{\evect}{{int(rand * 8)}}
\pgfmathsetmacro{\fvect}{{int(rand * 8)}}
\pgfmathsetmacro{\gvect}{{int(rand * 8)}}
\pgfmathsetmacro{\hvect}{{int(rand * 8)}}
\pgfmathsetmacro{\ivect}{{int(rand * 7)}}
\pgfmathsetmacro{\jvect}{{int(rand * 7)}}
\pgfmathsetmacro{\kvect}{{int(rand * 7)}}
\pgfmathsetmacro{\lvect}{{int(rand * 6)}}
\pgfmathsetmacro{\mvect}{{int(rand * 6)}}
\pgfmathsetmacro{\nvect}{{int(rand * 5)}}
\pgfmathsetmacro{\ovect}{{int(rand * 7)}}
\pgfmathsetmacro{\pvect}{{int(rand * 7)}}
\tkzDefPoint(\avect,\ivect){A}
\tkzDefPoint(\bvect,\jvect){B}
\tkzDefPoint(\cvect,\kvect){C}
\tkzDefPoint(\dvect,\lvect){D}
\tkzDefPoint(\evect,\mvect){E}
\tkzDefPoint(\fvect,\nvect){F}
\tkzDefPoint(\gvect,\ovect){G}
\tkzDefPoint(\hvect,\pvect){H}
\tkzDefPoint(\ivect,\avect){I}
\tkzDefPoint(\jvect,\bvect){J}
\tkzDefPoint(\kvect,\cvect){K}
\tkzDefPoint(\lvect,\dvect){L}
\tkzDefPoint(\mvect,\evect){M}
\tkzDefPoint(\nvect,\fvect){N}
\tkzDefPoint(\ovect,\gvect){O}
\tkzDefPoint(\pvect,\hvect){P}
\tkzDrawSegments[->,line width=2pt](A,B C,D E,F G,H I,J K,L M,N O,P)
\tkzLabelPoints(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P)
\end{tikzpicture}
\end{document}
结果是:
我怎样才能实现自动化,以便让更多的载体能够进入?
答案1
如果您需要超过 26 个点,您将需要使用数字作为点的名称。(宏\foreach
允许\foreach \pnt in {A,...,P}
。)
这里我使用了三个\foreach
循环:
定义点——我们不使用
\pgfmathsetmacro
(或者说\pgfmathtruncatemacro
)我们只使用randint
函数xfp
包裹显然是tkz
内部使用的。或者我们使用宏
evaluate
中的密钥\foreach
(使用 PGFmath):\foreach \pnt[ evaluate={\xVal=random(-8,8); \yVal=random(-7,7);}] in {1,...,50} { \tkzDefPoint(\xVal, \yVal){pnt-\pnt} }
绘制线段。
标记点 – 由于现在所有点都已命名,因此我们不能使用,因为这样看起来不太好。相反,我们使用更明确的版本,我们可以在其中指定自定义标签文本。
pnt-<num>
\tkzLabelPoints
\tkzLabelPoint
代码
\documentclass{standalone}
\usepackage{tkz-base,tkz-euclide}
\begin{document}
\begin{tikzpicture}
\tkzInit[xmin=-8,xmax=8,ymin=-7,ymax=7]
\tkzGrid
\tkzAxeXY
%\foreach \pnt in {1,...,50} {
% \tkzDefPoint({{randint(-8,8)},{randint(-7,7)}}){pnt-\pnt}
%}
\foreach \pnt[
evaluate={\xVal=random(-8,8);
\yVal=random(-7,7);}] in {1,...,50} {
\tkzDefPoint(\xVal, \yVal){pnt-\pnt}
}
\foreach \pnt[evaluate={\pntNext=\pnt+1;}] in {1,3,...,49} {
\tkzDrawSegments[->,line width=2pt](pnt-\pnt,pnt-\pntNext)
}
\foreach \pnt in {1,...,50} {
\tkzLabelPoint(pnt-\pnt){$p_{\pnt}$}
}
% vanilla TikZ alternative:
%\foreach \pnt in {1,...,50}
% \coordinate (pnt-\pnt) at ({random(-8,8)},{random(-7,7)});
%
%\foreach \pnt[evaluate={\pntNext=\pnt+1;}] in {1,3,...,49}
% \draw[->,line width=2pt](pnt-\pnt) -- (pnt-\pntNext);
%
%\foreach \pnt in {1,...,50}
% \node[below] at (pnt-\pnt) {$p_{\pnt}$};
\end{tikzpicture}
\end{document}