Выпуклые процедуры корпуса в scipy.spatial возвращают мне мой первоначальный набор точек

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

Вот точки в виде маринованного массива. Мой код приведен ниже:

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

Очевидно, что некоторые из этих точек являются внутренними по отношению к выпуклой оболочке и должны быть удалены через пространственный. Выпуклый Hull(точки) или пространственный. Делоне (точки), как это сделано в приведенных здесь двухмерных примерах.

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

1 ответ

Решение

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

Смотрите документацию для получения дополнительной информации.

Другие вопросы по тегам