У меня есть набор точек и вы хотите найти выпуклый корпус. Когда я даю им 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 должен уметь это делать.
Это, вероятно, 'hull.points [np.unique (hull.simplices)]', что он хочет позвонить, чтобы получить фактический список уникальных точек в выпуклой оболочке. – Jaime
Это так! Спасибо. – benten