我正在绘制一幅图,其中需要在另一个节点内均匀随机采样的节点。
这是我目前的尝试:
\documentclass[11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{arrows,automata,chains,calc, decorations,decorations.text,decorations.pathmorphing,shapes.callouts,shapes.symbols}
\newcommand{\tikzcircle}[2][red,fill=red]{\tikz[baseline=-0.5ex]\draw[#1,radius=#2] (0,0) circle ;}%
\usepackage{ifthen}
\begin{document}
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=5cm,
thick,main node/.style={circle,fill=green!20,draw,font=\sffamily\Large\bfseries}]
\node[main node] (1) {\begin{tikzpicture}
\foreach \l in {1,2,...,10}
{
\coordinate (myangle) at (rand*180:rand*20pt);
\node[draw=black,thick,fill=green,fill opacity=0.3,inner sep=0pt,minimum size=5pt] at (myangle) {};
}
\end{tikzpicture}};
\end{tikzpicture}
\end{document}
这种方法的问题首先在于这些点并不是均匀随机地分布在一个圆上。本质上我需要定义一个局部变量,称之为 u,它是两个 rand 的总和。然后我定义另一个变量 u',如果 u<1,则为 u,否则为 2-u。然后 myangle 应该定义为点 (rand*180:u'*20pt)。
这解决了均匀采样的问题(不幸的是我不知道如何定义局部变量所以我无法实现这一点:()。下一个问题是里面的图片在一个盒子里,但我希望它是一个圆圈,这样随机采样点周围的边缘就不会显得那么大,有什么想法可以让 tikzpicture 的输出是一个圆圈而不是正方形吗?或者我可以事后裁剪它,这样它就可以了?
先感谢您!
编辑:下面的答案提供了如何在圆圈内均匀采样的一个很好的例子,这就是我选择它作为“正确”答案的原因。我设法通过让外部节点具有选项来删除圆圈内的边距
inner sep=0,outer sep=0
如果其他人遇到这个问题,希望这会有所帮助。
答案1
对于沿圆周均匀采样,可以使用http://www.anderswallin.net/2009/05/uniform-random-points-in-a-circle-using-polar-coordinates/:均匀采样角度,但使用 0 到 1 之间的随机数的平方根来缩放半径。您可以使用该random
函数来实现此目的,该函数返回 0 到 1 之间的伪随机数:
\documentclass[11pt]{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\pgfmathsetseed{2}
\edef\radius{2cm}
\foreach\i in {1,...,250}{
\draw [gray] (0,0) circle [radius=\radius];
\pgfmathsetmacro\randA{random}
\pgfmathsetmacro\randB{sqrt(random())}
\fill ({\randA*360}:{\radius*\randB}) circle [radius=2pt];
}
\end{tikzpicture}
\end{document}
答案2
您可以通过在矩形内采样并剪切来在任何区域(例如,在任何类型的节点中)进行采样。
\documentclass[tikz,border=7mm]{standalone}
\usetikzlibrary{calc, shapes.geometric,shapes.misc, shapes.symbols}
\begin{document}
\begin{tikzpicture}
\node[circle,draw,minimum size=2cm, path picture ={
\foreach \i in {1,...,100}
\path let \p1=(path picture bounding box.south west),
\p2=(path picture bounding box.north east),
\n1={rnd}, \n2={rnd} in
({\n1*\x1+(1-\n1)*\x2},{\n2*\y1+(1-\n2)*\y2}) node[shape=star, star points=5,fill=red,draw,minimum size=4pt, inner sep=0pt]{};
}
] {};
\end{tikzpicture}
\end{document}
如果你circle
用替换cloud,cloud puffs=7
,则会得到: