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)
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
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
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