【问题标题】:Setting viewing position in Matplotlib 3d scatter plot在 Matplotlib 3d 散点图中设置查看位置
【发布时间】:2017-07-08 02:19:39
【问题描述】:

我在 3d 立方体中有一组点。我想根据观察者的位置在 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

【问题讨论】:

    标签: python numpy matplotlib 3d geometry


    【解决方案1】:

    问题在于 matplotlib 中的仰角和方位角是相对于轴原点的,而不是所绘制对象的中心。然后需要将对象的坐标转换为原点,并转换相对于对象的视点。

    然后通过将观察者位置转换为球极坐标https://en.wikipedia.org/wiki/Spherical_coordinate_system

    很容易得到方位角和仰角

    注意:高程 theta 是从参考平面测量的,因此 theta = arcsin(z/r)(而不是 arccos)。需要根据观察者所在的象限来校正方位角。

    【讨论】:

      猜你喜欢
      • 2020-12-17
      • 1970-01-01
      • 2016-07-26
      • 2012-07-07
      • 2015-10-18
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      相关资源
      最近更新 更多