2013-02-06 16 views
6

Sto provando a usare scipy (0.10.1) per un rapido trucco per visualizzare lo scafo convesso.Convex Hull e SciPy

posso ottenere convesso utilizzando il seguente codice:

vecs = [[-0.094218, 51.478927], [-0.09348, 51.479364], [-0.094218, 51.478927], 
     ... 
     [-0.094218, 51.478927], [-0.094321, 51.479918], [-0.094218, 51.478927], 
     [-0.094222, 51.478837], [-0.094241, 51.478388], [-0.094108, 51.478116], 
     [-0.09445, 51.480279], [-0.094256, 51.478028], [-0.094326, 51.500511]] 
hull = scipy.spatial.Delaunay(vecs).convex_hull 

matrice risultante si presenta così:

[[56, 9], [16, 1], [56, 1], [55, 9], [53, 55], [53, 16]] 

i numeri sono gli indici dei vertici. Il mio problema è non sono ordinati. Avrei bisogno che fossero in ordine CW o CCW per visualizzarli facilmente in KML.

C'è un modo semplice per avere scipy.spatial calcolare l'ordine in senso orario corretto?

risposta

10

Quindi questo codice sembra fare il trucco, ma potrebbe essere più semplice ... In sostanza, prima raccolgo i numeri dei vertici dallo scafo. Quindi computo il valore medio, più recente il set di dati e ordinarlo per l'angolo dalla media.

ps = set() 
for x, y in hull: 
    ps.add(x) 
    ps.add(y) 
ps = numpy.array(list(ps)) 
center = vecs[ps].mean(axis=0) 
A = vecs[ps] - center 
h = vecs[ps[numpy.argsort(numpy.arctan2(A[:,1], A[:,0]))]] 
4

ho scoperto un metodo piacevole ma richiede SciPy 0.11.0 (sparse.csgraph)

Ecco un esempio completo, l'ordinamento attuale sono le 2 Lignes seguenti il ​​"guscio sorta ... "commento.

import numpy as np 
import scipy as sp 

# random point cloud and hull 
X = np.random.randint(0,200,(30,2)) 
hull = sp.spatial.qhull.Delaunay(X).convex_hull 

# sort hull indices using (sparse) adjacency matrix graph stuff 
g = sp.sparse.csr_matrix((np.ones(hull.shape[0]),hull.T), shape=(hull.max()+1,)*2) 
sorted_hull = sp.sparse.csgraph.depth_first_order(g,hull[0,0],directed=False)[0] 

# display with matplotlib 
from matplotlib import pyplot as plt 
plt.plot(X[:,0],X[:,1],'.') 
plt.plot(X[sorted_hull,0],X[sorted_hull,1]) 
8

Nel documento dev corrente (0.13.0.dev) di scipy.spatial.ConvexHull, c'è una proprietà vertices che è antiorario in 2D.