基于@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
结果如下:
然而,这会导致点的分布似乎不均匀(请看椭圆两端的凝聚点,参见@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
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
带着以下结果:
我没有找到一种方法可以在参数绘图示例中重复使用你展示的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))