2017-07-04 13 views
0

私はこの長い間、正しい実装を今検索しています。2Dでプロットする3Dポリゴン

私は3次元の三角測量を行い、これを2Dでプロットしたいと考えています。 3Dで は私がそうするように管理します。 Complex 3D delauny triangulation. Half of the triangles hidden.

私も2次元プロットを必要としています。私はmatplotlib.tripcolor方法やmatplotlib.collections.PolyCollectionを使用して取得することです:

Complex 3D delauny triangulation mapped to 2D. Some triangles from the back of the structure are plotted

どのように私はトップなしで2Dでこれをプロットし、バックアップ混合三角形のすべてのですか?これまでに試みられたすべての方法では、構造の後ろにあるべき三角形によっていくつかの三角形が隠されています。

私は2D配列を既に用意しておく必要があるので、正しい順序でプロットするのに必要な情報がないことがわかります。深さ情報が失われます。

誰でもこの方法を知っていますか? ありがとう!

+0

[この質問]に対する答えの一つ(https://stackoverflow.com/questions/33084853/を発揮するように変更matplotlibの3次元プロット例の一つですset-matplotlib-view-to-be-normal-to-the-xy-plane-in-python)は、あなたが望むことをします。 – user3419537

+0

角度はすでに上の画像に正しく設定されています。問題は、上の2Dで他のものをプロットしたいということです。だから私は本当に2Dをしたいです –

+1

Matplotlibは3Dエンジンそのものではありません。したがってレンダリングには問題があります。トリップカラーは、前面の三角形でのみ使用できます。しかし、おそらく、あなたは、どの三角形が何かよりも大きい「x」を持つ頂点を持っているかチェックし、他の三角形をプロットする必要があることを意味します。これは、ボリュームの「形状」によってはうまくいくか悪くなるかもしれませんが、ピクセルごとの適切なデプスチェックがないと仮定します。シェイプが複雑すぎる場合は、独自の小さなレンダリングアルゴリズムを作成する必要があります(おそらく、imshowなどを使用します)。 – armatita

答えて

1

正投影を設定し、ビューを目的の平面に合わせて初期化し、選択した平面に直交する軸に沿って不要なプロット要素を削除することによって、2DプロットをAxes3dと擬似することができます。さらに、zdirキーワード引数を使用して2D要素をプロットすることもできます。

は、ここで私は多分

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
from matplotlib import cm 
import numpy as np 

# Enable orthographic projection 
# https://stackoverflow.com/questions/23840756/how-to-disable-perspective-in-mplot3d 
from mpl_toolkits.mplot3d import proj3d 
def orthogonal_proj(zfront, zback): 
    a = (zfront+zback)/(zfront-zback) 
    b = -2*(zfront*zback)/(zfront-zback) 
    return np.array([[1,0,0,0], 
         [0,1,0,0], 
         [0,0,a,b], 
         [0,0,-0.000001,zback]]) 
proj3d.persp_transformation = orthogonal_proj 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

# Init view to YZ plane 
ax.view_init(azim=0, elev=0) 

# Hide the X axis 
ax.w_xaxis.line.set_lw(0.) 
ax.set_xticks([]) 

# Change YZ plane colour to white 
ax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 1.0)) 

# Make data. 
X = np.arange(-5, 5, 0.25) 
Y = np.arange(-5, 5, 0.25) 
X, Y = np.meshgrid(X, Y) 
R = np.sqrt(X**2 + Y**2) 
Z = np.sin(R) 

# Plot the surface. 
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm, 
         linewidth=0, antialiased=False) 
ax.set_zlim(-1.1, 1.1) 
ax.set_ylabel('y') 
ax.set_zlabel('z') 

# Plot 2D elements with zdir argument 
# https://stackoverflow.com/questions/29549905/pylab-3d-scatter-plots-with-2d-projections-of-plotted-data 
stepsize = 0.1 
t = np.arange(-4, 4+stepsize, step=stepsize) 
ax.plot(t, 0.5*np.sin(t), 'k', zdir='x', linewidth=1.0) 
ax.text(0, 0, 1, 'Text', zdir='y', ha='center', va='top') 

plt.show() 

enter image description here

+0

ありがとうございます。私はそれを調べます。 –