2013-10-15 39 views
5

Mam zestaw punktów i chcę znaleźć wypukły kadłub. Kiedy podaję je scipy.spatial (ConvexHull lub Delaunay), otrzymuję oryginalny zestaw punktów. Z budowy nie powinno tak być.Wypukłe procedury kadłuba w scipy.spatial daje mi mój oryginalny zestaw punktów

Oto the points jako pikowana tablica numpy. My kod jest podany poniżej:

import pickle 
from scipy import spatial 
import matplotlib.pyplot as plt 

points = pickle.load(open("points.p", "rb")) 

hullpoints = spatial.ConvexHull(points).points 


# plot points 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
# ax.plot(points[:, 0], points[:, 1], points[:, 2], 'r.') # original points 
ax.plot(hullpoints[:, 0], hullpoints[:, 1], hullpoints[:, 2], 'r.') # convex hull of points 


# set labels and show() 
ax.set_xlabel('Player 1') 
ax.set_ylabel('Player 2') 
ax.set_zlabel('Player 3') 
plt.show() 

Oczywiście, niektóre punkty są wewnątrz na wypukłej i powinny być usunięte poprzez spatial.ConvexHull (punkty) lub spatial.Delaunay (punktów), jak to zrobiono w przykładach podanych 2d here.

Czy ktoś wie, dlaczego otrzymuję oryginalny zestaw punktów? Mógłbym brutalnie wymusić znajdowanie punktów zewnętrznych i drukować tylko te (ostatecznym celem jest powierzchnia o zewnętrznym kształcie zbliżona do punktów), ale wydaje się, że scipy.spatial powinien być w stanie to zrobić.

Odpowiedz

7

Używasz atrybutu .points, który daje ci punkty wejściowe. Zamiast tego spróbuj użyć atrybutu .simplices, który daje "punkty tworzące prostą powierzchnię wypukłego kadłuba".

See the documentation for more info.

+4

To chyba 'hull.points [np.unique (hull.simplices)]', że chce zadzwonić, aby uzyskać rzeczywistą listę unikalnych punktów wypukłych kadłuba. – Jaime

+0

To prawda! Dzięki wielkie. – benten