为了账号安全,请及时绑定邮箱和手机立即绑定

在球体上绘制点

在球体上绘制点

吃鸡游戏 2022-07-26 09:43:12
我正在尝试在球体上生成随机、均匀分布的点。但是,代码正在创建似乎创建磁盘的点。我认为问题在于“phirand”定义。那里的数学不正确吗?我在 Matlab 中使用了相同的代码,它在其中工作。代码:import numpy as npimport pylabfrom scipy.integrate import odeintimport matplotlib.pyplot as plt#import randomimport mpl_toolkits.mplot3d.axes3d as p3import random as randparticlecount = 10 ## of particles to generate energies for energy generationbinsize = 15 #Determines bin size for historgram of electron energiesRStart = 0.02phi1 = 0phi2 = 180phi1rad = phi1*(np.pi/180)phi2rad = phi2*(np.pi/180)#Generate random positions for each particle between s1 and s2ICPositions = 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()
查看完整描述

1 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

我想出了解决方案,但不明白它为什么起作用。从数学上讲,我对 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] 并且都覆盖相同的数值范围。如果有人对此有可靠的数学/编码原因,请评论我的答案以进一步解释。


查看完整回答
反对 回复 2022-07-26
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信