2017-07-04 239 views
0

我現在長時間搜索正確的實現。在2D中繪製三維多邊形

我有一個三維delaunay三角剖分,並想在2D中繪製這個。 在3D中,我設法做到了這一點: Complex 3D delauny triangulation. Half of the triangles hidden.

雖然我需要2D圖。我得到什麼用matplotlib.tripcolor方法或matplotlib.collections.PolyCollection是:

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

怎樣在2D繪製這沒有頂部和背部三角形都混了?到目前爲止所有的方法都已經嘗試過了,一些三角形被三角形隱藏,這些三角形應該位於結構的後面。

我明白了,這些方法沒有必要以正確的順序繪製信息,因爲我必須提供二維數組。深度信息丟失。

有誰知道如何做到這一點? 非常感謝!

+0

也許答案[這個問題]的一個(https://stackoverflow.com/questions/33084853/ set-matplotlib-view-to-the-normal-to-the-xy-plane-in-python)會做你想做的事 – user3419537

+0

不完全。該角度已經在頂部圖片中正確設置。問題是,我想在上面的2D中繪製其他的東西。所以我真的想要2D –

+1

Matplotlib本身不是3D引擎。因爲渲染是錯誤的。您只能在前三角形上使用tripcolor。但是這可能意味着你需要檢查哪些三角形的頂點大於某個'x',並繪製所有其他三角形。取決於音量的「形狀」,這可能會更好或更差,但假設沒有適當的像素逐像素深度檢查。如果形狀太複雜,則可能需要構建自己的小型渲染算法(可能使用imshow或類似方法)。 – armatita

回答

1

您可以通過設置正交投影,初始化視圖以面對所需平面,以及沿與選定視平面正交的軸移除不需要的繪圖元素,來模擬一個帶有Axes3d的二維圖。另外,您可以使用zdir關鍵字參數繪製2D元素。

這裏的matplotlib 3D圖的例子之一我修改演示

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

謝謝。我會研究這一點。 –