在球体上绘制点

我正在尝试在球体上生成随机、均匀分布的点。但是,代码正在创建似乎创建磁盘的点。我认为问题在于“phirand”定义。那里的数学不正确吗?我在 Matlab 中使用了相同的代码,它在其中工作。


代码:


import numpy as np

import pylab

from scipy.integrate import odeint

import matplotlib.pyplot as plt

#import random

import mpl_toolkits.mplot3d.axes3d as p3

import random as rand


particlecount = 10 ## of particles to generate energies for energy generation

binsize = 15 #Determines bin size for historgram of electron energies

RStart = 0.02

phi1 = 0

phi2 = 180

phi1rad = phi1*(np.pi/180)

phi2rad = phi2*(np.pi/180)


#Generate random positions for each particle between s1 and s2

ICPositions = np.array([])

for i in range(0,particlecount):

    #In Spherical: Generates random position with boundaries of: S1<r<S2

    thetarand = (2*np.pi)*rand.uniform(0,1) #Random # generation for component y between s1 and s2

    phirand = np.arcsin((np.sin(phi2rad) - np.sin(phi1rad))*rand.uniform(0,1) + np.sin(phi1rad))

    xrand = RStart*np.sin(phirand)*np.cos(thetarand)

    yrand = RStart*np.sin(phirand)*np.sin(thetarand)

    zrand = RStart*np.cos(phirand)

    randArray = np.array([xrand,yrand,zrand])

    randArray = np.array(randArray,dtype = float)

    if ICPositions.size == 0:

        ICPositions = np.array([randArray])

    else:

        ICPositions = np.append(ICPositions,[randArray],axis = 0)


print(ICPositions)


fig = plt.figure()

ax = fig.add_subplot(111,projection='3d')

ax.scatter(ICPositions[:,0],ICPositions[:,1],ICPositions[:,2],c='r',marker='o')

ax.set_xlabel('x axis')

ax.set_ylabel('y axis')

ax.set_zlabel('z axis')

plt.show()


吃鸡游戏
浏览 87回答 1
1回答

慕斯王

我想出了解决方案,但不明白它为什么起作用。从数学上讲,我对 x、y 和 z 的转换定义没有任何问题(在我用谷歌搜索并查看了教科书之后)。但是,我看到另一篇文章,其中有人对这些坐标的定义略有不同(用余弦替换所有 phi 分量的正弦),但没有解释原因。当我替换它时,以下工作:xrand = RStart*np.sin(phirand)*np.cos(thetarand)yrand = RStart*np.sin(phirand)*np.sin(thetarand)zrand = RStart*np.cos(phirand)有了这个:xrand = RStart*np.cos(phirand)*np.cos(thetarand)yrand = RStart*np.cos(phirand)*np.sin(thetarand)zrand = RStart*np.sin(phirand)同样,我不知道为什么会这样,但@Jenny 在另一篇帖子中给出了提示,该帖子询问了关于相同代码的不同问题。使用 [-90,90] 而不是 [0,180] 可能是需要此更改的原因,但我再次不确定为什么作为 sin[0,90,180] --> [0,1,0] 而 cos[-90,0 ,90] --> [0,1,0] 并且都覆盖相同的数值范围。如果有人对此有可靠的数学/编码原因,请评论我的答案以进一步解释。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python