如何在球面上随机散布点

5

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)

在这里输入图片描述

然而,如果我使用rand()vec(x), vec(y), vec(z)相乘,
我仍将得到相同的图,唯一的区别是坐标轴变化,换句话说,球体被“压扁”了。


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)

enter image description here


1
在这里,您可以找到一些不错的解决方案,用Python实现相对简单:https://math.stackexchange.com/questions/1585975/how-to-generate-random-points-on-a-sphere 我个人之前使用过“生成3D随机点并除以其范数”的方法,效果非常好。 - GPhilo
1
不要通过范围生成点,而是尝试通过随机函数生成它们。 - Amit Gupta
显然我的评论消失了,所以我再次展示这个链接:https://dev59.com/G1sX5IYBdhLWcg3wUuCa - Peter O.
1个回答

7

最简单的方法似乎是对每个维度进行高斯采样,然后按照此答案所述规范化结果向量的长度。存在一个非常小的可能性得到长度为零的向量,可以通过拒绝采样来处理。将这些组合起来,您可以这样做:

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

这提供了一个由3个元组组成的向量,每个元组代表点的x、y和z坐标,您可以像以前一样绘制它们。使用推导式可以提取坐标的单独向量:

xs = [p[1] for p in points]
ys = [p[2] for p in points]
zs = [p[3] for p in points]

这种方法可以轻松地推广到任意数量的维度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接