2013-10-15 12 views
5

私は点集合を持ち、凸包を探したいと思います。私がscipy.spatial(ConvexHullまたはDelaunayのいずれか)にそれらを与えるとき、私はちょうどポイントの元のセットを戻します。建設によって、これは当てはまりません。scipy.spatialの凸包ルーチンは、元の点集合を返します

ここにthe pointsは、漬けた淡色の配列である。所与の2Dの実施例で行ったように、明らかにこれらの点のいくつかが凸包に内装され、spatial.ConvexHull(点)またはspatial.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() 

:私のコードを以下に示します。 here

なぜ元のポイントセットが返ってくるのか誰にも分かりますか?私はブルートフォースで外的な点を見つけてそれらをプロットすることができます(最終的な目標は点によって近似された外形の表面プロットです)が、scipy.spatialはこれを行うことができるはずです。

答えて

7

入力ポイントを返す.points属性を使用しています。 .simplices属性を代わりに使用してください。これにより、「凸包の単純な面を形成する点」が得られます。

See the documentation for more info.

+4

それはおそらく彼が凸包でユニークなポイントの実際のリストを取得するために呼び出すために望んでいることを 'hull.points [np.unique(hull.simplices)]'です。 – Jaime

+0

それはそうです!本当にありがとう。 – benten

関連する問題