2016-06-29 9 views
1

Ich versuche, einen 'geschlossenen' Zylinder in Matplotlib zu machen, aber ich bin mir nicht sicher, wie dies zu tun ist. Bisher habe ich einen Zylinder mit den Enden geöffnet haben, ist der Code für diese wie folgt:Wie schließe ich die Enden eines Zylinders in Matplotlib

#make a cylinder without the ends closed 
import numpy as np 
from matplotlib import cm 
from matplotlib import pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
from scipy.linalg import norm 
from mpl_toolkits.mplot3d.art3d import Poly3DCollection 
import numpy as np 
import math 




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



origin = [0,0,0] 
#radius = R 
p0 = np.array(origin) 
p1 = np.array([8, 8, 8]) 
origin = np.array(origin) 
R = 4 

#vector in direction of axis 
v = p1 - p0 
#find magnitude of vector 
mag = norm(v) 
#unit vector in direction of axis 
v = v/mag 
#make some vector not in the same direction as v 
not_v = np.array([1, 0, 0]) 
if (v == not_v).all(): 
    not_v = np.array([0, 1, 0]) 
#make vector perpendicular to v 
n1 = np.cross(v, not_v) 
#normalize n1 
n1 /= norm(n1) 
#make unit vector perpendicular to v and n1 
n2 = np.cross(v, n1) 
#surface ranges over t from 0 to length of axis and 0 to 2*pi 
t = np.linspace(0, mag, 600) 
theta = np.linspace(0, 2 * np.pi, 100) 
#use meshgrid to make 2d arrays 
t, theta = np.meshgrid(t, theta) 
#generate coordinates for surface 
X, Y, Z = [p0[i] + v[i] * t + R * np.sin(theta) * n1[i] + R * np.cos(theta) * n2[i] for i in [0, 1, 2]] 


#make the color for the faces 
col1 = plt.cm.autumn(np.ones(600)) # linear gradient along the t-axis 
col1 = np.repeat(col1[np.newaxis,:, :], 100, axis=0) # expand over the theta-axis 



ax.plot_surface(X, Y,Z, facecolors = col1, shade = True,edgecolors = "None", alpha = 0.4, linewidth = 0) 

plt.show() 

Ausführen dieses Codes erzeugt folgendes Bild enter image description here

Wie würde ich die Enden des Zylinders mit einem festen schließen Kreis (zB Scheibe)?

Antwort

1

Ein schneller und einfacher Weg, der Ihrem anderen Code ähnlich ist, besteht darin, eine Oberfläche mit Streifen von r=0 bis r=R zu erzeugen. Kurz vor plt.show() die folgenden Zeilen:

R = np.array([0,R]) 
# cap at t=0 
X, Y, Z = [p0[i] + np.outer(R, np.sin(theta)) * n1[i] + np.outer(R, np.cos(theta))*n2[i] for i in [0, 1, 2]] 
ax.plot_surface(X, Y, Z, edgecolors = "r", alpha=.4, linewidth = .1) 
# cap at t=mag 
X, Y, Z = [p0[i] + v[i]*mag + np.outer(R, np.sin(theta)) * n1[i] + np.outer(R, np.cos(theta))*n2[i] for i in [0, 1, 2]] 
ax.plot_surface(X, Y, Z, edgecolors = "r", alpha=.4, linewidth = .1) 

Hier die Farben sind zu illustrativen Zwecken, vor allem, so dass Sie die Streifen sehen können. Das Ergebnis sieht so aus: enter image description here

Verwandte Themen