2013-10-15 4 views
5

У меня есть набор точек и вы хотите найти выпуклый корпус. Когда я даю им scipy.spatial (либо ConvexHull или Delaunay), я просто возвращаю исходный набор точек. По построению это не должно быть.Выпуклая процедура корпуса в scipy.spatial возвращает мне мой первоначальный набор очков

Здесь the points в виде маринованной матрицы. Мой код приведен ниже:

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() 

Очевидно, что некоторые из этих точек являются внутренними для выпуклой оболочки и должны быть удалены с помощью spatial.ConvexHull (точек) или spatial.Delaunay (точки), как это сделано в примерах 2d here.

Кто-нибудь знает, почему я возвращаю исходный набор очков? Я мог бы грубой силой найти внешние точки и заговорить только те (конечная цель - поверхностный график для внешней формы, аппроксимированный точками), но кажется, что scipy.spatial должен уметь это делать.

ответ

7

С помощью атрибута .points вы возвращаете входные точки. Вместо этого попробуйте использовать атрибут .simplices, который дает вам «точки, образующие упрощенные грани выпуклого корпуса».

See the documentation for more info.

+4

Это, вероятно, 'hull.points [np.unique (hull.simplices)]', что он хочет позвонить, чтобы получить фактический список уникальных точек в выпуклой оболочке. – Jaime

+0

Это так! Спасибо. – benten