2013-07-14 2 views
3

Comment déterminer, à l'aide Qhull, qui cellules VORONOI (par indice) sont « bon » (en « sommets existants »)relaxation voronoi et lloyd en utilisant python/scipy

Je suis en train d'effectuer un relâchement des contraintes à l'aide LLoyds algorithme et entrée générée par scipy.spatial Voronoi (qui est un wrapper pour Qhull).

En termes de code, il ressemble à:

points = [n for n in itertools.product(xrange(3),xrange(3))] 
vor = Voronoi(points) 

vor2 = lloyd(vor) # my relaxation function - not relevant to the question 

Le graphique de sortie généré par le code semble correct (voir ci-dessous) mais les données dans la structure vor ne suffit pas pour effectuer la relaxation Lloyds. C'est parce que je devrais seulement déplacer les points qui sont à l'intérieur des cellules de voronoï valides (# 4 dans l'image). L'autre devrait être laissé tel quel. Qhull désordre l'ordre des points/régions, donc je ne peux pas estimer quelle région appartient à quel point.

Voici l'illustration du problème:

print vor.vertices 
#[[ 0.5 0.5] 
# [ 1.5 0.5] 
# [ 0.5 1.5] 
# [ 1.5 1.5]] 

print vor.regions 
# [[], [-1, 0], [-1, 1], [1, -1, 0], [3, -1, 2], [-1, 3], [-1, 2], [3, 2, 0, 1], [2, -1, 0], [3, -1, 1]] 

print vor.points 
# [[ 0. 0.] 
# [ 0. 1.] 
# [ 0. 2.] 
# [ 1. 0.] 
# [ 1. 1.] 
# [ 1. 2.] 
# [ 2. 0.] 
# [ 2. 1.] 
# [ 2. 2.]] 
print vor.point_region 
# [1 8 6 3 7 4 2 9 5] 

Maintenant, je dois trouver une certaine façon que vor.regions [7] est une région qui appartient au point vor.points [4]. Comment y parvenir?

Voronoi on 3x3 grid

Répondre

3

Vous avez un region vous le savez, un point vous n'avez pas, et vous savez que vor.point_region[point] == region. Pour une seule region, vous pouvez comprendre le correspondant point comme:

point = np.argwhere(vor.point_region == region) 

Vous pouvez également créer un tableau d'indexation region_point pour comprendre plusieurs points à partir d'un tableau de regions comme:

region_point = np.argsort(vor.point_region) 
points = region_point[regions-1] 
+0

Peut-être que je l'ai fait comprends pas votre réponse, mais quand je lance la commande proposée par vous: np.argwhere (vor.point_region == 4) le résultat est: array ([[5]]) ce qui est inexact. :( – Chris

+1

C'est parce que vous devriez exécuter 'np.argwhere (vor.point_region == 7)'. Vous connaissez votre région (7), c'est le point (4) que vous recherchez, n'est-ce pas? le point que vous faites simplement 'vor.point_region [4]'. – Jaime

Questions connexes