Построение точек на сфере - PullRequest
       13

Построение точек на сфере

0 голосов
/ 11 февраля 2020

Я пытаюсь генерировать случайные, равномерно распределенные точки на сфере. Однако код создает точки, которые, кажется, вместо этого создают диск. Я считаю, что проблема заключается в определении «фиранд». Математика там не верна? Я использовал тот же код в 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()

1 Ответ

0 голосов
/ 28 февраля 2020

Я разобрался с решением, но не понимаю, почему оно работает. С математической точки зрения нет ничего плохого в моих определениях преобразования для x, y и z (после того, как я его погуглил и посмотрел в учебнике). Однако я увидел еще один пост, в котором кто-то определил эти координаты немного по-другому (замена синусов косинусами для всех фи-компонентов) без объяснения причин. Следующее сработало, когда я заменил это:

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] и оба охватывают одинаковые числовые диапазоны. Если у кого-то есть solid математическая / кодовая причина для этого, пожалуйста, прокомментируйте мой ответ, чтобы объяснить дальше.

...