2015-07-07 6 views
0

Я пытаюсь распространять пятна на сфере. Там есть функция, чтобы определить место с Rho, тета, фи его сферические координаты:Как повернуть 3D-точку с numpy?

def make_spot_3d_spherical(bright, spread, rho, theta, phi): 


    x0 = int(rho*np.sin(theta)*np.cos(phi)) 
    y0 = int(rho*np.sin(theta)*np.sin(phi)) 
    z0 = int(rho*np.cos(phi)) 

    # Create x and y indices 
    x = np.linspace(-50, 50, 200) 
    y = np.linspace(-50, 50, 200) 
    z = np.linspace(-50, 50, 200) 

    X, Y, Z = np.meshgrid(x, y, z) 

    Intensity = np.uint16(bright*np.exp(-((X-x0)/spread)**2 
             -((Y-y0)/spread)**2 
             -((Z-z0)/spread)**2)) 

    return Intensity 

Два набора пятен определяются (S_t или S_p) путем изменения тета или фи для фиксированного значения Rho:

#set of Spots defined by varying theta or phi 
S_t = np.asarray([make_spot_3d_spherical(1000,2, 30,t,0) for t in [0,np.pi/6,np.pi/3,2*np.pi/3]]) 
S_p = np.asarray([make_spot_3d_spherical(1000,2, 30,0,phi) for phi in [0,np.pi/6,np.pi/3,2*np.pi/3]]) 

Затем набор точек суммируется, чтобы сделать 3D-массив, содержащий разные пятна, с np.sum(S_t, axis =0). Тогда 3D массив проецируется вдоль одной из трех осей:

set_of_St0 = np.sum(np.sum(S_t, axis =0), axis = 0) 
set_of_St1 = np.sum(np.sum(S_t, axis =0), axis = 1) 
set_of_St2 = np.sum(np.sum(S_t, axis =0), axis = 2) 

set_of_Sp0 = np.sum(np.sum(S_p, axis =0), axis = 0) 
set_of_Sp1 = np.sum(np.sum(S_p, axis =0), axis = 1) 
set_of_Sp2 = np.sum(np.sum(S_p, axis =0), axis = 2) 

Наконец, отображаются различные проекции:

plt.subplot(131, xticks=[], yticks=[]) 
plt.imshow(set_of_Sp0, interpolation = 'nearest') 

plt.subplot(132, xticks=[], yticks=[]) 
plt.imshow(set_of_Sp1, interpolation = 'nearest') 

plt.subplot(133, xticks=[], yticks=[]) 
plt.imshow(set_of_Sp2, interpolation = 'nearest') 
plt.show() 

В полученных изображений, я ждал, чтобы увидеть пятна распределены вдоль некоторых круги, который является не тот случай, когда фи изменяется:

phi varies

или когда изменяется тета:

enter image description here

благодарит за советом.

ответ

1

В функции make_spot_3d_spherical вы получили sin и cos замешан в вашем определении x0:

x0 = int(rho*np.sin(theta)*np.cos(phi)) 

должен быть

x0 = int(rho*np.cos(theta)*np.sin(phi)) 

Теперь она работает. Вот если вы меняете phi:

S_p = np.asarray([make_spot_3d_spherical(1000,2, 30,0,phi) for phi in np.linspace(0, 2*np.pi, 20)]) 
set_of_Sp0 = np.sum(np.sum(S_p, axis =0), axis = 0) 
plt.imshow(set_of_Sp0, interpolation = 'nearest') 

enter image description here