为什么随机生成的球形点云不均匀分布?

问题描述 投票:0回答:1

我正在尝试模拟从点光源发出的辐射。为此,给定光源的坐标和所需的放射线长度,我在球坐标中随机生成方向矢量,将其转换为笛卡尔坐标,然后返回正确的终点。但是,当我运行它并在Blender中可视化生成的点云(由所有随机生成的端点组成)时,我发现它在球体的“极点”上的密度更高。我希望这些点沿球体均匀分布。我该如何实现?

enter image description here

随机生成函数:

def getRadiationEmissionLineSeg(p, t):
    if(p.size == 4):
        #polar angle spans [0, pi] from +Z axis to -Z axis
        #azimuthal angle spans [0, 2*pi] orthogonal to the zenith (in the XY plane)
        theta = math.pi * random.random()
        phi = 2 * math.pi * random.random()

        #use r = 1 to get a unit direction vector
        v = sphericalToCartesian(1, theta, phi)

        #parametric vector form: vec = p + tv
        #p = point that lies on vector (origin point in case of a ray)
        #t = parameter (-inf, inf) for lines, [0, inf) for rays
        #v = direction vector (must be normalized)
        return p + t * v

球坐标->笛卡尔转换函数:

def sphericalToCartesian(r, theta, phi):

    x = r * math.sin(theta) * math.cos(phi)
    y = r * math.sin(theta) * math.sin(phi)
    z = r * math.cos(theta)

    return npy.array([x, y, z, 0])
python random blender
1个回答
0
投票

当您通过球坐标变换点并且角度theta接近pi时,作为[0,2pix {theta}的图像的圆圈]越来越小。由于θ是均匀分布的,因此极点附近会有更多点。可以在网格图像上看到。

sphere

如果要在球体上生成均匀分布的点,则可以使用以下事实:如果您用两个平行平面切割一个球体,则这些平面之间的球面带的面积仅取决于这些平面之间的距离。因此,您可以使用两个均匀分布的随机变量在球面上获得均匀分布:

  • -r和r之间的z坐标,
  • 与经度对应的[0,2pi)之间的角度θ。

然后您可以轻松计算出x和y坐标。

© www.soinside.com 2019 - 2024. All rights reserved.