在节点内均匀采样

在节点内均匀采样

我正在绘制一幅图,其中需要在另一个节点内均匀随机采样的节点。

这是我目前的尝试:

\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,则会得到:

在此处输入图片描述

相关内容