如何均匀地随机化球体表面上的点?

时间:2012-01-12 17:02:40

标签: math geometry

我试图在天空中制作星星,但星星分布不均匀。

这是我试过的:

rx = rand(0.0f, PI*2.0f);
ry = rand(0.0f, PI);
x = sin(ry)*sin(rx)*range;
y = sin(ry)*cos(rx)*range;
z = cos(ry)*range;

结果是:

img http://img716.imageshack.us/img716/3320/sphererandom.jpg

rx = rand(-1.0f, 1.0f);
ry = rand(-1.0f, 1.0f);
rz = rand(-1.0f, 1.0f);
x = rx*range;
y = ry*range;
z = rz*range;

结果是:

img2 http://img710.imageshack.us/img710/5152/squarerandom.jpg

(虽然没有制作球体,但是opengl不会有所区别。)

正如你所看到的,总有一些“角落”的平均点数更多。如何在球体上创建随机点,均匀分布点?

3 个答案:

答案 0 :(得分:4)

你可以做到

z = rand(-1, 1)
rxy = sqrt(1 - z*z)
phi = rand(0, 2*PI)
x = rxy * cos(phi)
y = rxy * sin(phi)

这里rand(u,v)从interal [u,v]

中绘制一个统一的随机数

答案 1 :(得分:1)

如果可以生成随机高斯变量,则不需要三角函数,你可以做(​​伪代码)

x <- gauss()
y <- gauss()
z <- gauss()
norm <- sqrt(x^2 + y^2 + z^2)

result = (x / norm, y / norm, z / norm)

或者在单位立方体内绘制点,直到其中一个位于单位球内,然后标准化:

double x, y, z;

do
{
    x = rand(-1, 1);
    y = rand(-1, 1);
    z = rand(-1, 1);
} while (x * x + y * y + z * z > 1);

double norm = sqrt(x * x + y * y + z * z);
x / norm; y /= norm; z /= norm;

答案 2 :(得分:0)

看起来你可以看到笛卡尔坐标正在产生浓度。

Here解释了一种正确(和错误)的方式来获得正确的分配。