2015-08-14 1 views
1

Avis: le answer par aqueiros, bien plus haut voté, est pas correct. Particulièrement cette déclaration "vor.regions a toujours un tableau vide dans le premier index", n'est pas vrai.Obtenir point associé à la région Voronoi (scipy.spatial.Voronoi)


Je suis génération d'un simple tessellation 2D Voronoi, en utilisant la fonction scipy.spatial.Voronoi. J'utilise une distribution 2D aléatoire des points (voir MCVE ci-dessous).

J'ai besoin d'un moyen de passer par chaque région définie (définie par scipy.spatial.Voronoi) et d'obtenir les coordonnées du point qui lui est associé (c'est-à-dire: le point que cette région entoure).

Le problème est qu'il y a N+1 régions (polygones) définies pour les points N, et je ne suis pas sûr de ce que cela signifie.

Voici un MCVE qui échouera quand il arrive à la dernière région:

from scipy.spatial import Voronoi 
import numpy as np 

# Generate random data. 
N = 10 
x = [np.random.random() for i in xrange(N)] 
y = [np.random.random() for i in xrange(N)] 
points = zip(x, y) 

# Obtain Voronoi regions. 
vor = Voronoi(points) 

# Loop through each defined region/polygon 
for i, reg in enumerate(vor.regions): 

    print 'Region:', i 
    print 'Indices of vertices of Voronoi region:', reg 
    print 'Associated point:', points[i], '\n' 

Une autre chose que je ne comprends pas pourquoi y at-il vor.regions vide stockés? Selon les documents:

régions: Indices des sommets de Voronoï formant chaque région de Voronoï. -1 indique le sommet en dehors du diagramme de Voronoï.

Que signifie une région vide?


Ajouter

J'ai essayé l'attribut point_region mais apparemment je ne comprends pas comment cela fonctionne. Il renvoie les index hors de la plage de la liste points. Par exemple: dans le MCVE ci-dessus, il affichera toujours un index 10 pour une liste de 10 points, ce qui est clairement hors limites.

+0

Les instances de 'Voronoi' ont un attribut' point_region' qui fait exactement ce que vous recherchez. [Lire les docs!] (Http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.spatial.Voronoi.html) – Jaime

+0

@Jaime J'ai essayé cet attribut, s'il vous plaît voir ce que j'ai ajouté à la question. – Gabriel

Répondre

1

J'ai mal interprété les documents. Il dit:

point_region: Index de la région Voronoi pour chaque point d'entrée .

et j'utilisais point_region comme si elle était la « Index du point d'entrée pour chaque région Voronoi ».

Au lieu d'utiliser:

points[i] 

point correct coordonnées de chaque région peut être obtenue avec:

np.where(vor.point_region == i)[0][0] 
4

Pour votre première question:

La question est qu'il ya sont N + 1 régions (polygones) définies pour les N points, et je ne suis pas sûr de ce que cela signifie.

Ceci est dû au fait que votre vor.regions aura toujours un tableau vide. Quelque chose comme

[[],[0, 0],[0, 1],[1, 1]] 

Ceci est lié à votre deuxième question:

Une autre chose que je ne comprends pas pourquoi y at-il vor.regions vides stockés? Selon les docs: régions: Indices des sommets de Voronoi formant chaque région de Voronoi. -1 indique le sommet en dehors du diagramme de Voronoï. Que signifie une région vide?

Par défaut Voronoi() utilise qhull avec des options de QBB Qc Qz Qx 'activé (qhull.org/html/qvoronoi.htm). Cela insère un "point-à-infini" qui est utilisé pour améliorer la précision sur les entrées circulaires. Par conséquent, étant un "faux" point, il n'a pas de région. Si vous voulez vous en débarrasser, essayez de supprimer l'option Qz:

vor = Voronoi(points, qhull_options='Qbb Qc Qx') 
+0

Bienvenue dans StackOverflow. Il serait bon d'ajouter un peu de contexte pour cette réponse --- les réponses au code seulement sont mal vues. –

+0

Merci pour le conseil @jb – aqueiros

+0

@aqueiros désolé pour la réponse tardive à votre réponse. 1) Vous dites que * vor.regions a toujours un tableau vide dans le premier index *. Si vous lancez le MCVE plusieurs fois dans ma question, vous verrez que la région vide n'est pas ** toujours associée à l'index 0. 2) Ma deuxième question concernait l'existence de * régions vides *, et non la existence de régions avec -1 vertix. – Gabriel