对于一篇论文,我必须画一个椭圆,它由坐标系中的随机点填充。
当然,绘制椭圆和坐标系不是问题。我还知道函数“rand”与“only marks”结合使用可以创建随机点。如何在椭圆中创建这些(随机)点?
答案1
这是一个非常非常简单的问题。一些(或者,在最坏的情况下,所有)点可能不可见,因为它们被隐藏了。您可以修改它\pgfmathsetseed
以获取另一个分布,或者将其注释掉以在每次运行时获取新的分布。
代码
\documentclass[tikz, border=2mm]{standalone}
\begin{document}
\begin{tikzpicture}
\draw (0,0) ellipse (4 and 2);
\clip (0,0) ellipse (4 and 2);
\pgfmathsetseed{24122015}
\foreach \p in {1,...,50}
{ \fill (4*rand,2*rand) circle (0.05);
}
\end{tikzpicture}
\end{document}
输出
编辑1:我尝试了一下,因为我想让所有点都位于椭圆内。第二个版本生成一个随机 x 值,然后计算一个随机 y 值,使其位于椭圆内。由于 x 极值的“y 空间”较小,因此点会聚集在长轴的端点。第三个版本是极坐标形式的椭圆:首先,随机选择一个角度,并计算半径使其位于椭圆内。在这里,点会聚集在短轴和中心,即所谓的戈索尔1-分配。
代码
\documentclass[tikz, border=2mm]{standalone}
\begin{document}
\begin{tikzpicture}
\draw (0,0) ellipse (4 and 2);
\clip (0,0) ellipse (4 and 2);
\pgfmathsetseed{24122015}
\foreach \p in {1,...,1000}
{ \fill[black] (4*rand,2*rand) circle (0.05);
}
\end{tikzpicture}
\begin{tikzpicture}
\draw (0,0) ellipse (4 and 2);
\clip (0,0) ellipse (4 and 2);
\pgfmathsetseed{24122015}
\foreach \p in {1,...,1000}
{ \pgfmathsetmacro{\x}{4*rand}
\pgfmathsetmacro{\y}{rand*0.5*sqrt(16-pow(\x,2))}
\fill[black] (\x,\y) circle (0.05);
}
\end{tikzpicture}
\begin{tikzpicture}
\fill[inner color=black, outer color=yellow!20!black] (0,0) ellipse (4 and 2);
\clip (0,0) ellipse (4 and 2);
\pgfmathsetseed{24122015}
\foreach \p in {1,...,1000}
{ \pgfmathsetmacro{\t}{360*rnd}
\pgfmathsetmacro{\r}{rnd*4*2/(sqrt(pow(2*cos(\t),2)+pow(4*sin(\t),2)))}
\pgfmathsetmacro{\c}{abs(\r)/4*100}
\fill[yellow!\c!red] (\t:\r) circle (0.05);
\typeout{\t, \r, \c}
}
\end{tikzpicture}
\end{document}
输出
1:这完全是我编造的。格索尔是一个名字索伦,反派指环王, 在早期就已使用 ;-) 因为我通常在圣诞节期间与家人一起观看三部曲,所以我觉得这个小笑话很合适。
答案2
每当有人问用随机点填充什么东西时,有是使用答案JLDiaz 的泊松圆采样代码:
\documentclass{article}
\usepackage{tikz}
\usepackage{poisson}
\begin{document}
\edef\mylist{\poissonpointslist{8}{4}{0.1}{20}}
\begin{tikzpicture}
\begin{scope}
\clip (4,2) ellipse (4 and 2);
\foreach \x/\y in \mylist {
\fill (\x,\y) circle(1pt);
}
\end{scope}
\draw (4,2) ellipse (4 and 2);
\end{tikzpicture}
\end{document}
以下是在TikZ中用随机点填充指定区域:150 个均匀分布的点,全部位于椭圆内:
椭圆上半部分的方程是
sqrt( 2^2 * (1 - x^2/(4^2) )
这逆的反导数是
2 * asin(x/4)
比例因子为4/pi
。
\documentclass[tikz, border=2mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\pgfmathsetseed{3}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
hide axis,
axis equal,
declare function={a(\x) = sqrt( 2^2 * (1 - \x^2/(4^2) );},
declare function={b(\x) = -sqrt( 2^2 * (1 - \x^2/(4^2) );},
declare function={f(\x) = 2 * rad(asin(x/4)) * 4 / pi;}
]
\addplot [only marks, samples=150, domain=-4:4] ({f(x) },{rand * ( a(f(x)) - b(f(x)) ) / 2} );
\draw (0,0) ellipse [x radius=4, y radius=2];
\end{axis}
\end{tikzpicture}
\end{document}
x radius=2
以下是带有和 的椭圆的代码y radius=1
:
\documentclass[tikz, border=2mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\pgfmathsetseed{3}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
%hide axis,
xmin=-4, xmax=4,
axis equal,
declare function={a(\x) = sqrt( 1^2 * (1 - \x^2/(2^2) );},
declare function={b(\x) = -sqrt( 1^2 * (1 - \x^2/(2^2) );},
declare function={f(\x) = 2 * rad(asin(x/4)) * 2 / pi;}
]
\addplot [only marks, samples=150, domain=-4:4] ({f(x) },{rand * ( a(f(x)) - b(f(x)) ) / 2} );
\draw (0,0) ellipse [x radius=2, y radius=1];
\end{axis}
\end{tikzpicture}
\end{document}