如何在球面上生成等分的点?

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

我想生成一个包含 n 个相同部分的球体。例如,我想将球面分成 36 X 36 部分。因此,它总共应包含 1296 个等份。我不知道如何在球形(3D)空间中生成点。

我希望我的图看起来像这样,但代替线,我只想要点(两条线相交的地方)。

我只知道下面提到的公式,

X = R * np.sin(PHI) * np.cos(THETA)
Y = R * np.sin(PHI) * np.sin(THETA)
Z = R * np.cos(PHI)

如何生成球体中等份的点?

enter image description here

python-3.x matplotlib math geometry spherical-coordinate
1个回答
2
投票
  • 要使 phi 和 theta 沿 [0,180] 和 [0,360] 变化:使用

    numpy.linspace

  • 要获得

    cos(phi) * cos(theta)
    的所有可能组合:使用外积
    numpy.outer

  • 要沿等角度分割,请使用

    z = sin(phi)
    ;要分割成面积相等的矩形,请沿 z 轴均等分割。

import numpy as np

def split_sphere(R = 1, horizontal_split = 36, vertical_split = 36, method="equal_angles"):
    theta = np.linspace(0,360,horizontal_split+1)
    if method == "equal_angles":
        phi = np.linspace(0, 180, vertical_split+1)
        c = np.cos(phi)
        s = np.sin(phi)
    elif method == "equal_area":
        c = np.linspace(-1, 1, vertical_split+1)
        s = 1 - c**2
    else:
        raise(ValueError('method must be "equal_angles" or "equal_area"'))
    x = R * np.outer(s, np.cos(theta))
    y = R * np.outer(s, np.sin(theta))
    z = R * np.outer(c, np.ones(horizontal_split+1))
    return x, y, z

def main():
    import matplotlib.pyplot as plt
    x,y,z = split_sphere()
    fig = plt.figure()
    ax = fig.add_subplot(projection='3d')
    ax.scatter(x,y,z)
    plt.show()

if __name__=='__main__':
    main()

36x36 points on sphere, split along equal angles

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