gnuplot - 在椭圆体内绘制随机点

时间:2013-09-11 01:18:11

标签: math random geometry gnuplot ellipse

我想使用gnuplot在椭圆体的边界内创建和绘制一组随机点。是否可以直接在gnuplot中执行此操作,还是需要在外部程序中生成随机数据点?

最终我想生成一个与此ellipse figure类似的椭球形图。

有一些使用randcylindrical/spherical coordinates的例子,但我不确定如何在椭圆体的边界内生成随机点。

2 个答案:

答案 0 :(得分:3)

根据@ Bernhard的回答,这里是你如何只用gnuplot来做到这一点。要重用随机数,您可以将两个rand调用和赋值放在using语句的第一个参数中,用逗号分隔。 using语句从左到右进行评估,因此您可以在以下所有using参数中访问这些变量。

为了证明这一点,请参阅以下示例:

set samples 1000
plot '+' using (x=rand(0), y=rand(0), x):(y)

将此应用于椭圆体,这将给出脚本:

a=3
b=2
phi=30*pi/180

max(x,y) = (x > y ? x : y)
set xrange[-max(a,b):max(a,b)]
set yrange[-max(a,b):max(a,b)]

set offset 0.1,0.1,0.1,0.1
set samples 2000

ex(x, y) = a*(2*x-1)
ey(x, y) = b*(sqrt(1-((2*x-1))**2))*(2*y-1)

unset key    
plot '+' using (x=rand(0), y=rand(0), ex(x,y)*cos(phi)-ey(x,y)*sin(phi)):\
               (ey(x,y)*cos(phi)+ex(x,y)*sin(phi)) pt 7 ps 0.5

结果:

enter image description here

然而,这导致了点的明显不均匀分布(参见椭圆末端的集合,见@ andyras的评论)。为了避免这种情况,以下是如何将均匀分布的随机点过滤到椭球内部的方法:

a=3
b=2
set angles degree
phi=30

max(x,y) = (x > y ? x : y)
set xrange[-max(a,b):max(a,b)]
set yrange[-max(a,b):max(a,b)]

set offset 0.1,0.1,0.1,0.1
set samples 2000
set size ratio 1

check(x, y) = (((x/a)**2 + (y/b)**2) <= 1)
unset key
plot '+' using (x=2*a*(rand(0)-0.5), y=2*b*(rand(0)-0.5), \
     check(x,y) ? x*cos(phi)-y*sin(phi) : 1/0):\
     (x*sin(phi)+y*cos(phi)) pt 7 ps 0.5

这给出了更好的结果:

enter image description here

将此扩展到三个维度:

a=3
b=1
c=1
set angles degree
phi=30

mx(x,y) = (x > y ? x : y)
max(x,y,z) = mx(mx(x,y), mx(x,z))
set xrange[-max(a,b,c):max(a,b,c)]
set yrange[-max(a,b,c):max(a,b,c)]
set zrange[-max(a,b,c):max(a,b,c)]

set offset 0.1,0.1,0.1,0.1
set samples 2000
set size ratio 1

set ticslevel 0
set view 60, 330

check(x, y, z) = (((x/a)**2 + (y/b)**2 + (z/c)**2) <= 1)
unset key
splot '+' using (x = 2*a*(rand(0)-0.5), \
                 y = 2*b*(rand(0)-0.5), \
                 z=2*c*(rand(0)-0.5), \
                 check(x,y,z) ? x*cos(phi)-y*sin(phi) : 1/0):\
                 (x*sin(phi)+y*cos(phi)):(z) pt 7 ps 0.5

结果:

enter image description here

答案 1 :(得分:2)

我没有找到在您展示的参数化示例中重用rand(0)的方法,但是通过对命令行工具的内部调用,您可以通过一些修改来实现:

unset key
a=3
b=2

set xrange [-a:a]
set yrange [-b:b]
set style function dots
plot "<seq 1000 | awk '{print rand(), rand()}'" using (a*(2*$1-1)):(b*(sqrt(1-((2*$1-1))**2))*(2*$2-1))

将此转换为3D是留给读者的练习(只需继续这些表达式)