2013-10-15 29 views
5

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.

Antwort

7

Sie verwenden das .points Attribut, das Ihnen die Eingabepunkte zurückgibt. Versuchen Sie stattdessen, das Attribut .simplices zu verwenden, das Ihnen die "Punkte gibt, die die vereinfachten Facetten der konvexen Hülle bilden".

See the documentation for more info.

+4

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

+0

Das macht es! Vielen Dank. – benten