我在一个三维立方体中有一组点。我想根据观察者所在的位置,在2d中得到这些点的视觉投影。到目前为止,我一直在试着用3d绘制我的点,并设置仰角和方位角,这样我就可以看到侧面的立方体了。在
这是一个简单的例子,但是我需要能够将我的代码推广到观察者的任何(x,y,z)位置。以下是我目前所做的尝试:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
coord = np.random.uniform(2.,4., (10000,3)) # cube points
los = np.array([10.,3.,3]) #observer position ( looking at side of cube)
center = np.array([3.,3.,3.]) #cube center
def elev(los, target):
diff = target - los
cosel = np.sum(los*diff)/np.sqrt(np.sum(los**2.) * np.sum(diff**2.))
el = np.degrees(np.arccos(cosel))
return el
def azi(los, target):
diff = target - los
cosazi = (-los[2]*los[0]*diff[0] - los[2]*los[1]*diff[1] + \\
(los[0]**2.+los[1]**2)*diff[2]) / np.sqrt((los[0]**2.+los[1]**2.)* \\
(los[0]**2.+los[1]**2.+los[2]**2)*(diff[0]**2.+diff[1]**2.+diff[2]**2))
sinazi = (-los[2]*diff[0] + los[0]*diff[1]) / \\
np.sqrt((los[0]**2.+los[1]**2.)*(diff[0]**2.+diff[1]**2.+diff[2]**2.))
tanazi = sinazi/cosazi
azi = np.degrees(np.arctan(tanazi))
return azi
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(coord[:,0], coord[:,1], coord[:,2], edgecolor = "none", alpha = 0.3)
ax.view_init(elev=elev(los, center), azim=azi(los,center))
plt.show()
我应该看到一个完美的正方形,但是我得到的视角是有角度的。怎么了?在
我从这里借用了仰角和方位角公式:https://gis.stackexchange.com/questions/58923/calculate-view-angle
问题是matplotlib中的仰角和方位角是相对于轴原点的,而不是相对于所绘制对象的中心的。然后有必要将物体的坐标转换为原点,并转换相对于物体的视角。在
然后通过将观测者的位置转换成球极坐标https://en.wikipedia.org/wiki/Spherical_coordinate_system很容易得到方位角和仰角
注:高程θ是从基准面测量的,因此θ=arcsin(z/r)(而不是arccos)。方位角需要根据观察者所在的象限进行修正。在
相关问题 更多 >
编程相关推荐