使用 TikZ 绘制递归随机结构

使用 TikZ 绘制递归随机结构

今天早些时候,我学会了如何画漂亮的随机树(在 TikZ 中绘制随机树),我发现我对结果不太满意——因为我想要绘制的结构实际上不是一棵树,而是一场高能粒子雨。这是我能做的最好的事情:

\documentclass{article}

\usepackage{tikz}
\usepackage{xkeyval}
\usepackage{etoolbox}
\usepackage{ifthen}

\makeatletter
\define@key{hepshower}{nTracks}{\edef\nTracks{#1}}
\define@key{hepshower}{phimin}{\edef\phiMin{#1}}
\define@key{hepshower}{phisep}{\edef\phiSep{#1}}
\define@key{hepshower}{phimax}{\edef\phiMax{#1}}
\define@key{hepshower}{rmin}{\edef\radMin{#1}}
\define@key{hepshower}{rmax}{\edef\radMax{#1}}
\define@key{hepshower}{br}{\edef\branchingProbability{#1}}
\define@key{hepshower}{maxdepth}{\edef\maxDepth{#1}}
\presetkeys{hepshower}{nTracks=5,phimin=-90,phimax=90,rmin=0.5,rmax=1.0,phisep=10,br=0.9,maxdepth=3}{}

\newcommand\drawshower[2][]{
  \typeout{#2}
  \setkeys{hepshower}{#1}{
    \foreach \i in {1,...,\nTracks} {
      \pgfmathparse{(\radMax-\radMin)*rnd+\radMin}
      \edef\radVal{\pgfmathresult}
      \pgfmathparse{\phiMin+(\phiMax-\phiMin)*(\i-1)/\nTracks + rnd * ((\phiMax-\phiMin)/\nTracks-\phiSep) + \phiSep/2}
      \edef\phiVal{\pgfmathresult}
      \typeout{#2 \i : \phiVal - \radVal}
      \edef\coordname{#2-showerchild\i}
      \coordinate (\coordname) at (\phiVal:\radVal);
      \draw[black] (#2) --  (\coordname);
      \pgfmathparse{(\radMax-\radMin)*rnd+\radMin}
      \pgfmathparse{rnd}
      \ifnumcomp{\maxDepth}{>}{0}{
        \ifthenelse{\lengthtest{\pgfmathresult pt<\branchingProbability pt}}{
          \drawshower[#1,maxdepth=\maxDepth-1]{\coordname}
        }{}
      }{}
    }
  }
}

\makeatother

\begin{document}
\begin{tikzpicture}
  \coordinate (test);
  \drawshower[phimin=0,phimax=180]{test};
\end{tikzpicture}
\end{document}

如果您运行输出,您会从\typeouts 中看到所有节点都已创建,并且一切似乎都正常工作 - 除了似乎只绘制了第一次迭代。我认为这与极坐标有关,但我不太清楚它出了什么问题。


编辑

根据 Qrrbibel 的评论,这是一张我所希望看到的淋浴图片:

大气碰撞

如您所见,它具有树状结构,但不同分支的节点并不平整,并且随着树的扩展,线条的长度不断减小且角度不断变化,与纯粹的示意图树相比,整个事物看起来更加真实。

相关内容