2014-04-22 34 views
5

我有6個點都位於球體的表面上並且是八面體的頂點。我怎樣才能將這個八面體的表面映射到三維軸上的球體內?在給定頂點的pylab中繪製3d表面

我有以下的代碼,但它不會做什麼,我希望:

from mpl_toolkits.mplot3d import Axes3D 
from mpl_toolkits.mplot3d.art3d import Poly3DCollection 
import matplotlib.pyplot as plt 

Points=[[ 0.17770898, 0.72315927, 0.66742804], 
     [-0.65327074, -0.4196453 , 0.63018661], 
     [ 0.65382635, 0.42081934, -0.62882604], 
     [-0.17907021, -0.72084723, -0.66956189], 
     [-0.73452809, 0.5495376 , -0.39809158], 
     [ 0.73451554, -0.55094017, 0.39617148]] 

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

ax.add_collection3d(Poly3DCollection([Points])) 

u = np.linspace(0, np.pi, 30) 
v = np.linspace(0, 2 * np.pi, 30) 

x = np.outer(np.sin(u), np.sin(v)) 
y = np.outer(np.sin(u), np.cos(v)) 
z = np.outer(np.cos(u), np.ones_like(v)) 

ax.plot_wireframe(x, y, z, alpha=0.3) 

plt.show() 

謝謝您的幫助。

+1

你知道哪一行拋出錯誤嗎? – acomar

+0

請發佈_full_追蹤。 – tacaswell

回答

2

A Poly3DCollection是一個多邊形列表,一個多邊形是一個點列表,一個點是一個包含三個值的列表。所以你應該把值列表的列表傳遞給Poly3DCollection。更改以下代碼:

ax.add_collection3d(Poly3DCollection([Points])) 
+0

非常感謝,解決了這個錯誤,但我不清楚自己以後的情況。請看我編輯的問題。 –

2

要添加HYRY的答案;從多個多邊形面的列表中構建一個體積,並且每個面依次由一系列點構建。 (因此,如果臉部相鄰,則每個點在列表列表中出現多次)。考慮下面的片段,其中的點已標記爲:

from mpl_toolkits.mplot3d import Axes3D 
from mpl_toolkits.mplot3d.art3d import Poly3DCollection 
import matplotlib.pyplot as plt 
fig = plt.figure() 
ax = fig.add_subplot (1, 1, 1, projection = '3d', aspect = 1) 

# octahedron 
A = [ 0.17770898, 0.72315927, 0.66742804] 
B = [-0.65327074, -0.4196453 , 0.63018661] 
C = [ 0.65382635, 0.42081934, -0.62882604] 
D = [-0.17907021, -0.72084723, -0.66956189] 
E = [-0.73452809, 0.5495376 , -0.39809158] 
F = [ 0.73451554, -0.55094017, 0.39617148] 
OCTO = [[E, A, B], 
     [E, B, D], 
     [E, D, C], 
     [E, C, A], 
     [F, A, B], 
     [F, B, D], 
     [F, D, C], 
     [F, C, A], 
] 
ax.add_collection3d (Poly3DCollection (OCTO)) 

# sphere 
u = np.linspace (0, np.pi, 30) 
v = np.linspace (0, 2 * np.pi, 30) 
x = np.outer (np.sin (u), np.sin (v)) 
y = np.outer (np.sin (u), np.cos (v)) 
z = np.outer (np.cos (u), np.ones_like (v)) 
ax.plot_wireframe (x, y, z, alpha = 0.3) 

plt.show() 
+0

這個解決方案可以工作,但是對於非常大的點集合,將會產生一個具有重複數據的變量'OCTO'。一個首選的解決方案將讓我們使用整數索引進入點的集合。你知道如何做到這一點? – ofloveandhate