2013-01-03 2 views
3

Est-ce que quelqu'un avec l'expérience Python pourrait jeter un coup d'oeil à ceci pour moi?Modification de la classe voronoi pour renvoyer des points de polygone en python

J'utilise ce code:

https://bitbucket.org/mozman/geoalg/src/5bbd46fa2270/geoalg/voronoi.py

pour effectuer tesselation voronoi sur un groupe de points.

Cela fonctionne, mais le problème est que le code fournit uniquement une liste de tous les sommets utilisés pour créer les polygones, et quelles paires doivent être jointes ensemble. Il ne fournit aucune information sur les points utilisés pour composer chaque polygone dont j'ai besoin.

Merci.

Répondre

3

context.triangles indique à quel point d'entrée les triangles de Delaunay participent. Chaque triangle est lié à un sommet de Voronoï. Les triangles et les sommets sont stockés parallèlement dans les tableaux triangles et vertices.

Pour trouver la cellule Voronoi pour un point donné p, il est nécessaire de trouver tous les sommets (triangles) dans lesquels le point d'entrée est utilisé. Et que de trouver l'ordre comment ces sommets sont connectés par edges tableau.

est ici un simple code (pas tout à fait testé) de le faire:

from voronoi import voronoi 
import random 
from collections import defaultdict 

num_points = 50 
points = [(random.uniform(0,10), random.uniform(0,10)) for i in xrange(num_points)] 
c = voronoi(points) 

# For each point find triangles (vertices) of a cell 
point_in_triangles = defaultdict(set) 
for t_ind, ps in enumerate(c.triangles): 
    for p in ps: 
     point_in_triangles[p].add(t_ind) 

# Vertex connectivity graph 
vertex_graph = defaultdict(set) 
for e_ind, (_, r, l) in enumerate(c.edges): 
    vertex_graph[r].add(l) 
    vertex_graph[l].add(r) 

def cell(point): 
    if point not in point_in_triangles: 
     return None 
    vertices = set(point_in_triangles[point]) # copy 
    v_cell = [vertices.pop()] 
    vertices.add(-1) # Simulate infinity :-) 
    while vertices: 
     neighbours = vertex_graph[v_cell[-1]] & vertices 
     if not neighbours: 
      break 
     v_cell.append(neighbours.pop()) 
     vertices.discard(v_cell[-1]) 
    return v_cell 

for p in xrange(num_points): 
    print p, cell(p) 
+0

C'est incroyable, merci! Cela semble fonctionner parfaitement aussi. J'ai eu une petite question de suivi, les résultats que la cellule (p) renvoie, la liste des nombres, sont ceux les valeurs d'index pour les sommets? Ils renvoient tous des valeurs mais c'est difficile à tester. – djcmm476

+0

Ah, non, tout va bien. Mes résultats étaient un peu confus par les valeurs de l'infini. Mais vraiment, merci encore, je suis coincé là-dessus depuis des lustres et c'est très utile. – djcmm476

+0

Des trucs géniaux, ça marche bien. J'ai remarqué que les deux voronoi de Boost et celui-ci produisent des valeurs aberrantes. Pas à l'infini, mais encore très loin du jeu de points original. Je ne peux pas comprendre pourquoi. – Bram

Questions connexes