2017-02-18 25 views
0

3Dキューブ内にポイントがあります。私はオブザーバーがどこにあるかに応じて2dでこれらの点の視覚的な投影を得たいと思う。これまでのところ、3Dでポイントをプロットしようとしていて、仰角と方位角を設定して、横に立方体を表示しています。Matplotlibの視点位置を設定する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

答えて

0

問題はmatplotlibの中に高度と方位軸の原点に関して、いない描画オブジェクトの中心であるということです。従って、オブジェクトの座標を原点に変換し、オブジェクトに関して視点を変換することが必要である。

そして方位角および仰角が球状極座標にhttps://en.wikipedia.org/wiki/Spherical_coordinate_system

注観察者の位置を変換することにより取得することは非常に簡単である:仰角シータは、基準面から測定されるので、シータ=アークサイン(Z/R)(代わりにのarccos)。オブザーバがどの象限にあるかに応じて、方位角を修正する必要があります。