2014-12-03 20 views
6

Ho bisogno di tracciare una nuvola di punti 3D (numero di punti: N), quindi uno scafo convesso (in realtà un poliedro con N vertici) dai punti. Ho realizzato uno script in python con scipy.spatial ConvexHull per tracciare 8 punti e tracciare un cubo, la trama della nuvola di punti è ok, ma il cubo non è ok, perché il codice mette due linee che attraversano la faccia diagonale del cubo oltre alle linee di bordo. Non capisco perché trama le linee attraverso le facce.Scafo convesso 3D da nuvola di punti

Lo script:

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

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

points= np.array([[0,0,0], 
      [4,0,0], 
      [4,4,0], 
      [0,4,0], 
      [0,0,4], 
      [4,0,4], 
      [4,4,4], 
      [0,4,4]]) 

hull=ConvexHull(points) 

edges= zip(*points) 

for i in hull.simplices: 
    plt.plot(points[i,0], points[i,1], points[i,2], 'r-') 

ax.plot(edges[0],edges[1],edges[2],'bo') 

ax.set_xlabel('x') 
ax.set_ylabel('y') 
ax.set_zlabel('z') 

ax.set_xlim3d(-5,5) 
ax.set_ylim3d(-5,5) 
ax.set_zlim3d(-5,5) 

plt.show() 

Risultato dello script:

enter image description here

+0

Come posso modificare la mia domanda? Ho dimenticato "Ciao a tutti", dalla prima riga, e se clicco su "modifica" e voglio salvare le modifiche, non succede nulla. – Feri

risposta

3

so che questo è vecchio, ma sono venuto qui da Google quindi penso che altri potrebbero anche.

Il problema riguarda solo il metodo di stampa che si utilizza. Un simplex è un triangolo ND definito da 3 punti. Ma la funzione di traccia deve ritornare all'ultimo punto, altrimenti vengono disegnati solo 2 di 3 bordi simplex.

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


# 8 points defining the cube corners 
pts = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], 
       [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1], ]) 

hull = ConvexHull(pts) 

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

# Plot defining corner points 
ax.plot(pts.T[0], pts.T[1], pts.T[2], "ko") 

# 12 = 2 * 6 faces are the simplices (2 simplices per square face) 
for s in hull.simplices: 
    s = np.append(s, s[0]) # Here we cycle back to the first coordinate 
    ax.plot(pts[s, 0], pts[s, 1], pts[s, 2], "r-") 

# Make axis label 
for i in ["x", "y", "z"]: 
    [enter image description here][1]eval("ax.set_{:s}label('{:s}')".format(i, i)) 

plt.show() 
Problemi correlati