2016-06-29 4 views
1

matplotlibで '閉じた'シリンダーを作ろうとしていますが、これをどうやって行うのかは分かりません。次のようにこれまでのところ、私は開放端とシリンダーを持って、このためのコードは次のとおりです。このコードを実行する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() 

は、私はしっかりとした円筒の両端を閉鎖する方法を、次の画像enter image description here

を生成します円(すなわちディスク)?

答えて

1

他のコードと似ている簡単で簡単な方法は、r=0からr=Rまでのストリップを使用してサーフェスを生成することです。右plt.show()前に、次の行を追加します。ここでは

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) 

を色はあなたがストリップを見ることができ、主にので、例示的な目的のためのより多くのです。結果は次のようになります。 enter image description here

関連する問題