如何计算Voronoi图的哪个站点有一个新点?

时间:2017-11-15 13:41:50

标签: python scipy voronoi

我写了一个小脚本,用于显示来自this tutorialM点的voronoi图。我使用scipy.spatial

我想给一个新的飞机点,并说这一点是在voronoi图的哪个站点。可能吗?

这是我的代码:

import random
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import Voronoi, voronoi_plot_2d

N = 70
M = 10

Matrix = [(random.random()*100,random.random()*100)  for x in range(M)]
points = np.array(Matrix)


vor = Voronoi(points)
print(vor.ridge_vertices)

voronoi_plot_2d(vor)
plt.show()

1 个答案:

答案 0 :(得分:1)

通过Voronoi图的概念,新点P所属的单元由原点中与P最近的点生成。找到这一点是直接最小化距离:

point_index = np.argmin(np.sum((points - new_point)**2, axis=1))

但是,您想要找到区域。不幸的是vor.regions中的区域与vor.points的顺序不同(我不明白为什么因为每个点都应该有一个区域)。

所以我使用了以下方法:

  1. 使用vor.ridge_points
  2. 查找我想要的点周围的所有山脊
  3. 从这些脊中取出所有脊顶点,作为一组
  4. 查找具有相同顶点集的(唯一)区域。
  5. 结果:

    M = 15
    points = np.random.uniform(0, 100, size=(M, 2))
    vor = Voronoi(points)
    voronoi_plot_2d(vor)
    
    new_point = [50, 50]   
    plt.plot(new_point[0], new_point[1], 'ro')
    
    point_index = np.argmin(np.sum((points - new_point)**2, axis=1))
    ridges = np.where(vor.ridge_points == point_index)[0]
    vertex_set = set(np.array(vor.ridge_vertices)[ridges, :].ravel())
    region = [x for x in vor.regions if set(x) == vertex_set][0]
    
    polygon = vor.vertices[region]
    plt.fill(*zip(*polygon), color='yellow')  
    plt.show()
    

    这是一个演示:

    enter image description here

    请注意,如果区域无界,则该区域的颜色将不正确;这是简单的着色方法的缺陷,而不是区域寻找算法的缺陷。有关为无界区域着色的正确方法,请参阅Colorize Voronoi Diagram

    除此之外:我使用NumPy生成随机数,这比你做的更简单。