2017-07-03 17 views
5

Ich versuche, ein Parallelepiped zu zeichnen. Eigentlich begann ich aus dem Python-Skript einen Würfel als Zeichnung:Python zeichnen 3D-Würfel

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

points = np.array([[-1, -1, -1], 
        [1, -1, -1 ], 
        [1, 1, -1], 
        [-1, 1, -1], 
        [-1, -1, 1], 
        [1, -1, 1 ], 
        [1, 1, 1], 
        [-1, 1, 1]]) 


fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

r = [-1,1] 

X, Y = np.meshgrid(r, r) 

ax.plot_surface(X,Y,1, alpha=0.5) 
ax.plot_surface(X,Y,-1, alpha=0.5) 
ax.plot_surface(X,-1,Y, alpha=0.5) 
ax.plot_surface(X,1,Y, alpha=0.5) 
ax.plot_surface(1,X,Y, alpha=0.5) 
ax.plot_surface(-1,X,Y, alpha=0.5) 

ax.scatter3D(points[:, 0], points[:, 1], points[:, 2]) 

ax.set_xlabel('X') 
ax.set_ylabel('Y') 
ax.set_zlabel('Z') 

plt.show() 

Um einen quader zu erhalten, habe ich die Punkte Matrix durch die folgende Matrix multipliziert:

P = 

[[2.06498904e-01 -6.30755443e-07 1.07477548e-03] 

[1.61535574e-06 1.18897198e-01 7.85307721e-06] 

[7.08353661e-02 4.48415767e-06 2.05395893e-01]] 

als:

Z = np.zeros((8,3)) 

for i in range(8): 

    Z[i,:] = np.dot(points[i,:],P) 

Z = 10.0*Z 

ist meine Idee dann wie folgt darstellen:

ax.scatter3D(Z[:, 0], Z[:, 1], Z[:, 2]) 

ax.set_xlabel('X') 
ax.set_ylabel('Y') 
ax.set_zlabel('Z') 

plt.show() 

Und das ist, was ich bekommen:

enter image description here

Wie kann ich Oberflächen auf diesen verschiedenen Stellen dann die quader zu bilden (in der Art und Weise des Würfels oben)?

Antwort

4

Plot Flächen mit 3D PolyCollection (example)

import numpy as np 
from mpl_toolkits.mplot3d import Axes3D 
from mpl_toolkits.mplot3d.art3d import Poly3DCollection, Line3DCollection 
import matplotlib.pyplot as plt 

points = np.array([[-1, -1, -1], 
        [1, -1, -1 ], 
        [1, 1, -1], 
        [-1, 1, -1], 
        [-1, -1, 1], 
        [1, -1, 1 ], 
        [1, 1, 1], 
        [-1, 1, 1]]) 

P = [[2.06498904e-01 , -6.30755443e-07 , 1.07477548e-03], 
[1.61535574e-06 , 1.18897198e-01 , 7.85307721e-06], 
[7.08353661e-02 , 4.48415767e-06 , 2.05395893e-01]] 

Z = np.zeros((8,3)) 
for i in range(8): Z[i,:] = np.dot(points[i,:],P) 
Z = 10.0*Z 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

r = [-1,1] 

X, Y = np.meshgrid(r, r) 
# plot vertices 
ax.scatter3D(Z[:, 0], Z[:, 1], Z[:, 2]) 

# list of sides' polygons of figure 
verts = [[Z[0],Z[1],Z[2],Z[3]], 
[Z[4],Z[5],Z[6],Z[7]], 
[Z[0],Z[1],Z[5],Z[4]], 
[Z[2],Z[3],Z[7],Z[6]], 
[Z[1],Z[2],Z[6],Z[5]], 
[Z[4],Z[7],Z[3],Z[0]], 
[Z[2],Z[3],Z[7],Z[6]]] 

# plot sides 
ax.add_collection3d(Poly3DCollection(verts, 
facecolors='cyan', linewidths=1, edgecolors='r', alpha=.25)) 

ax.set_xlabel('X') 
ax.set_ylabel('Y') 
ax.set_zlabel('Z') 

plt.show() 

enter image description here

+0

Thank you very much !!! Vielen Dank für Ihre Freundlichkeit !!! – rogwar