如何在 tkz-euclide 中从 pgfmath 改进 rand?

如何在 tkz-euclide 中从 pgfmath 改进 rand?

我制作了这个最小文件:

\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循环:

  1. 定义点——我们不使用\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}
    }
    
  2. 绘制线段。

  3. 标记点 – 由于现在所有点都已命名,因此我们不能使用,因为这样看起来不太好。相反,我们使用更明确的版本,我们可以在其中指定自定义标签文本。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}

相关内容