2017-07-04 310 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

谢谢。我会研究这一点。 –