如何在球体上随机散布点
How to scatter randomly points on a sphere
using PyPlot
n = 50
u = range(0,stop=2*π,length=n);
v = range(0,stop=π,length=n);
x = cos.(u) * sin.(v)';
y = sin.(u) * sin.(v)';
z = ones(n) * cos.(v)';
scatter3D(vec(x),vec(y),vec(z);c="red",s=1)
但是,如果我将 vec(x)
、vec(y)
、vec(z)
与 rand()
、
相乘
我仍然得到相同的图,唯一的区别是轴发生了变化,或者换句话说,球体被“压扁”了。
using PyPlot
n = 50
u = range(0,stop=2*π,length=n);
v = range(0,stop=π,length=n);
x = cos.(u) * sin.(v)';
y = sin.(u) * sin.(v)';
z = ones(n) * cos.(v)';
scatter3D(rand()*vec(x),rand()*vec(y),rand()*vec(z);c="red",s=1)
最简单的方法似乎是对每个维度进行高斯采样,然后按照 this answer 中所述对结果向量的长度进行归一化。获得长度为零的向量的可能性非常小,可以通过拒绝采样来处理。把它们放在一起你会这样做:
points = map(1:n) do _
while true
x = randn()
y = randn()
z = randn()
l = hypot(x, y, z)
l ≠ 0 && return (x, y, z) ./ l
end
end
这给出了一个三元组向量,每个元组代表点的 x、y 和 z 坐标,您可以像以前一样绘制它。可以使用理解提取单独的坐标向量:
xs = [p[1] for p in points]
ys = [p[2] for p in points]
zs = [p[3] for p in points]
这种方法可以很容易地推广到任意数量的维度。
using PyPlot
n = 50
u = range(0,stop=2*π,length=n);
v = range(0,stop=π,length=n);
x = cos.(u) * sin.(v)';
y = sin.(u) * sin.(v)';
z = ones(n) * cos.(v)';
scatter3D(vec(x),vec(y),vec(z);c="red",s=1)
但是,如果我将 vec(x)
、vec(y)
、vec(z)
与 rand()
、
相乘
我仍然得到相同的图,唯一的区别是轴发生了变化,或者换句话说,球体被“压扁”了。
using PyPlot
n = 50
u = range(0,stop=2*π,length=n);
v = range(0,stop=π,length=n);
x = cos.(u) * sin.(v)';
y = sin.(u) * sin.(v)';
z = ones(n) * cos.(v)';
scatter3D(rand()*vec(x),rand()*vec(y),rand()*vec(z);c="red",s=1)
最简单的方法似乎是对每个维度进行高斯采样,然后按照 this answer 中所述对结果向量的长度进行归一化。获得长度为零的向量的可能性非常小,可以通过拒绝采样来处理。把它们放在一起你会这样做:
points = map(1:n) do _
while true
x = randn()
y = randn()
z = randn()
l = hypot(x, y, z)
l ≠ 0 && return (x, y, z) ./ l
end
end
这给出了一个三元组向量,每个元组代表点的 x、y 和 z 坐标,您可以像以前一样绘制它。可以使用理解提取单独的坐标向量:
xs = [p[1] for p in points]
ys = [p[2] for p in points]
zs = [p[3] for p in points]
这种方法可以很容易地推广到任意数量的维度。