Ich habe eine Reihe von Punkten und möchte die konvexe Hülle finden. Wenn ich sie scipy.spatial (entweder ConvexHull oder Delaunay) gebe, bekomme ich nur die ursprünglichen Punkte zurück. Aufgrund der Konstruktion sollte dies nicht der Fall sein.Konvexen Rumpf Routinen in scipy.spatial gibt mir meine ursprüngliche Reihe von Punkten
Hier sind the points als ein gebeiztes numpy-Array. Mein Code ist unten angegeben:
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()
Offensichtlich einige dieser Punkte sind Inneren der konvexen Hülle und sollte über spatial.ConvexHull (Punkte) oder spatial.Delaunay (Punkte) entfernt werden, wie in den 2d Beispiele getan gegeben .
Weiß jemand, warum ich die ursprünglichen Punkte zurückbekomme? Ich könnte Brute-Force die äußeren Punkte finden und nur diese plotten (das ultimative Ziel ist ein Oberflächen-Plot für die äußere Form, der durch die Punkte approximiert wird), aber es scheint, dass scipy.spatial in der Lage sein sollte, dies zu tun.
Es ist wahrscheinlich 'hull.points [np.unique (hull.simplices)]', dass er will die aktuelle Liste der einzigartigen Punkte in der konvexen Hülle zu erhalten, rufen. – Jaime
Das macht es! Vielen Dank. – benten