Je voulais trouver la zone de la carte de Boronoi, mais j'ai eu du mal à trouver l'article qui demandait la zone, alors j'aimerais l'écrire sous forme de mémo.
Je mettrai le code immédiatement.
def voronoi_area(points):
v = Voronoi(points)
vol = np.zeros(v.npoints)
for i, reg_num in enumerate(v.point_region):
indices = v.regions[reg_num]
if -1 in indices:
vol[i] = np.inf
else:
vol[i] = ConvexHull(v.vertices[indices]).volume
return vol
sample_points = [[-2, 6], [ 3, -8], [ 5, 9], [ 4, 5], [-7, 2], [ 3, 4]]
voronoi_area(sample_points)
# >>> [inf, inf, inf, 205.92126984, inf, 52.62380952]
Puisqu'il y a une partie qui devient inévitablement infinie dans la zone de la figure de Boronoi, j'essaye de la sortir comme np.inf. Si vous voulez l'empêcher de devenir infini, vous devez le refléter. Je pense que c'est nécessaire pour trouver la zone du diagramme de bore des athlètes, je vais donc la lister ci-dessous.
def voronoi_volumes(points, x_max, y_max):
points_len = np.shape(points)[0]
points1 = points.copy()
points1[:,1] = - points[:,1]
points2 = points.copy()
points2[:,1] = 2 * y_max - points[:,1]
points3 = points.copy()
points3[:,0] = - points[:,0]
points4 = points.copy()
points4[:,0] = 2 * x_max - points[:,0]
points = np.concatenate((points, points1, points2, points3, points4), axis=0)
v = Voronoi(points)
vol = np.zeros(v.npoints)
for i, reg_num in enumerate(v.point_region):
indices = v.regions[reg_num]
vol[i] = ConvexHull(v.vertices[indices]).volume
return vol[:points_len]
Entrez la valeur maximale de l'axe X dans x_max et la valeur maximale de l'axe Y dans y_max.
Je pense que le diagramme de Boronoi est souvent utilisé lors de l'analyse du sport, j'espère donc que vous l'utiliserez.
Recommended Posts