今天早些时候,我学会了如何画漂亮的随机树(在 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}
如果您运行输出,您会从\typeout
s 中看到所有节点都已创建,并且一切似乎都正常工作 - 除了似乎只绘制了第一次迭代。我认为这与极坐标有关,但我不太清楚它出了什么问题。
编辑
根据 Qrrbibel 的评论,这是一张我所希望看到的淋浴图片:
如您所见,它具有树状结构,但不同分支的节点并不平整,并且随着树的扩展,线条的长度不断减小且角度不断变化,与纯粹的示意图树相比,整个事物看起来更加真实。