2014-04-22 13 views
5

Ho 6 punti che si trovano tutti sulla superficie di una sfera e sono i vertici di un octoedro. Come posso plorificare la superficie di questo octoedro all'interno della sfera su un asse 3d?Tracciare una superficie 3d in pylab dato i vertici i

Ho il seguente codice ma non fa quello che speravo:

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() 

Grazie per il vostro aiuto.

+1

Sai qual è la linea che genera l'errore? – acomar

+0

Si prega di inviare il _full_ traceback. – tacaswell

risposta

2

A Poly3DCollection è un elenco di Poligoni e un Poligono è un elenco di punti, un punto è un elenco che contiene tre valori. Quindi dovresti passare un elenco di liste di valori a Poly3DCollection. Modificare il seguente codice:

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

Grazie mille, questo ha risolto l'errore ma non ero chiaro su cosa stavo cercando. Si prega di consultare la mia domanda modificata. –

2

Aggiungere la risposta di HYRY; un volume viene creato da un elenco di più facce poligonali e ciascuna faccia viene a sua volta creata da un elenco di punti. (Ogni punto è quindi presente più volte nell'elenco delle liste, se le facce sono adiacenti). Considera il seguente frammento, in cui i punti sono stati etichettati:

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

questa soluzione funziona, ma per raccolte di punti molto grandi, si otterrà una variabile 'OCTO' che ha dati duplicati. una soluzione preferita ci permetterebbe di utilizzare gli indici interi nella collezione di punti. sai come fare questo? – ofloveandhate