【问题标题】:How to randomize points on a sphere surface evenly?如何均匀地随机化球面上的点?
【发布时间】:2012-02-08 23:29:06
【问题描述】:

我想在天上做星星,但是星星分布不均匀。

这是我尝试过的:

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 不会有区别)。

如您所见,总有一些“角落”平均得分更多。如何在点将均匀分布的球体上创建随机点?

【问题讨论】:

标签: math geometry


【解决方案1】:

你可以的

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) 从内部 [u,v] 中抽取一个统一的随机数

【讨论】:

  • 没有。它可以从数学上推导出来。
  • @Alexandre C.,不是吗?!我测试了代码,我发誓:我不知道在任何地方有任何注意力!完全连我的眼睛...
  • @Drew,没有。假设 z = sin(t),我们选择 z 均匀分布,所以点在 [t, t+dt] 中的概率为 dP = 0.5dz = 0.5cos(t)dt。带[t, d+dt]的表面积为dS = 2PIcos(t)dt,所以密度为dP/dS=(4PI)^-1,不是t的函数。
  • 非信徒:img848.imageshack.us/img848/640/perfectdistribution.jpg(500k 点)使用 icando 的算法。
【解决方案2】:

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

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;

【讨论】:

  • 我想到了后者,但我也认为这很慢:一半的计算被浪费了,因为它们超出了范围。我现在正在使用 icando 的方法,它看起来真的很完美,而且速度也很快。
  • 我只为您进行了基准测试:icando 方法为 88.3ms,您的方法为 128.5ms!我计算了 500k 点。这些天CPU没有以某种方式优化sin / cos吗......?哦,我用的是梅森兰特。
  • 我认为 mersenne 是最好的......例如 PHP 使用它,他们称之为最好的等等。
  • 好的,你要求这个。将 xorshift 与您的算法一起使用:91.5 毫秒,将 xorshift 与 icando 的算法一起使用:80.5 毫秒。现在你什么都不能说,除了“过早的优化”之类的;)
【解决方案3】:

看起来您可以看到是笛卡尔坐标创建了浓度。

Here 解释了获得正确分布的一种正确(和错误)方法。

【讨论】:

    猜你喜欢
    • 2019-06-29
    • 1970-01-01
    • 2019-06-13
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多