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ć.
To chyba 'hull.points [np.unique (hull.simplices)]', że chce zadzwonić, aby uzyskać rzeczywistą listę unikalnych punktów wypukłych kadłuba. – Jaime
To prawda! Dzięki wielkie. – benten