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

2024-06-01 11:50:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图模拟点源发出的辐射。为此,给定源的坐标和所需的发射光线长度,我在球坐标中随机生成一个方向向量,将其转换为笛卡尔坐标,并返回正确的端点。然而,当我运行此程序,并在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])

Tags: to函数defpirandommathsin端点
1条回答
网友
1楼 · 发布于 2024-06-01 11:50:05

当你用球坐标变换点,角度θ接近π时,[0,2pi]x{θ}的图像圆会越来越小。因为θ是均匀分布的,所以在极点附近会有更多的点。它可以在网格的图像上看到

sphere

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

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

然后你可以很容易地计算x和y坐标

示例代码:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

r = 1
n = 1000

z = np.random.random(n)*2*r - r
phi = np.random.random(n)*2*np.pi

x = np.sqrt(1 - z**2)*np.cos(phi)
y = np.sqrt(1 - z**2)*np.sin(phi)

fig = plt.figure(figsize=(8, 8))
ax = plt.axes(projection='3d')
ax.scatter(x, y, z)
plt.show()

n=100,250,1000的结果:

Results

相关问题 更多 >