2017-07-04 4 views
0

Je recherche l'implémentation correcte pour cela depuis longtemps maintenant.tracer des polygones 3D en 2D

J'ai une triangulation en 3D delaunay et je veux tracer ceci en 2D. En 3D, j'arrive à le faire: Complex 3D delauny triangulation. Half of the triangles hidden.

J'ai besoin d'un tracé 2D. Qu'est-ce que je reçois en utilisant la méthode matplotlib.tripcolor ou matplotlib.collections.PolyCollection est:

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

Comment puis-je tracer ce en 2D sans le haut et triangles arrière sont brouillées? Avec toutes les méthodes essayées jusqu'ici, certains triangles sont cachés par des triangles qui devraient être à l'arrière de la structure.

Je vois, que les méthodes n'ont tout simplement pas les informations nécessaires pour tracer dans le bon ordre, puisque je dois déjà fournir des tableaux 2D. Les informations de profondeur sont perdues.

Est-ce que quelqu'un sait comment faire cela? Merci beaucoup!

+0

Peut-être l'une des réponses à [cette question] (https://stackoverflow.com/questions/33084853/ set-matplotlib-view-to-be-normal-to-the-xy-plane-in-python) fera ce que vous voulez – user3419537

+0

Pas tout à fait. L'angle est déjà correctement défini dans l'image supérieure. Le problème est, que je veux tracer d'autres choses en 2D ci-dessus. Donc, je veux vraiment 2D –

+1

Matplotlib n'est pas un moteur 3D en soi. Ainsi, le rendu est défectueux. Vous pouvez utiliser tripcolor uniquement avec les triangles avant. Mais cela implique probablement que vous devez vérifier quels triangles ont des sommets avec un 'x 'supérieur à quelque chose, et tracer tous les autres. Cela pourrait fonctionner mieux ou pire selon la "forme" de votre volume, mais supposer qu'il n'y a pas de vérification de profondeur pixel par pixel. Si la forme est trop complexe, vous devrez peut-être créer votre propre petit algorithme de rendu (peut-être en utilisant imshow ou similaire). – armatita

Répondre

1

Vous pouvez imiter un tracé 2D avec Axes3d en définissant une projection orthographique, en initialisant la vue pour faire face au plan souhaité et en supprimant les éléments de tracé indésirables le long de l'axe orthogonal au plan de vue choisi. En outre, vous pouvez tracer des éléments 2D à l'aide de l'argument mot clé zdir.

est ici un des exemples matplotlib 3D de terrain pour démontrer que je modifié

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

Merci. Je vais regarder dans cela. –