scipy.spatial.SphericalVoronoi¶
- class scipy.spatial.SphericalVoronoi(points, radius=1, center=None, threshold=1e-06)[源代码]¶
球面上的Voronoi图。
0.18.0 新版功能.
- 参数
- points浮点数,形状(npoint,ndim)
用于构建球面Voronoi图的点的坐标。
- radius浮动,可选
球体半径(默认值:1)
- centerNdarray of Floor,Shape(ndim,)
球体中心(默认值:原点)
- threshold浮动
检测点与球体参数之间的重复点和不匹配的阈值。(默认值:1E-06)
- 加薪
- ValueError
如果在中有重复项 points 。如果提供的 radius 与不一致 points 。
参见
Voronoi
传统的N维Voronoi图。
注意事项
球面Voronoi图算法如下进行。将计算输入点(生成器)的凸壳,并等效于它们在球体表面上的Delaunay三角剖分 [Caroli]. 然后使用凸壳邻域信息对每个生成器周围的Voronoi区域顶点进行排序。与基于角度的Voronoi区域顶点排序方法相比,后一种方法对浮点问题的敏感度要低得多。
对球形Voronoi算法性能的经验评估表明时间复杂度是二次的(对数线性是最优的,但算法实现起来更具挑战性)。
参考文献
- Caroli
Caroli等人。对球体上或球体附近的点进行健壮而高效的Delaunay三角剖分。研究报告RR-7004,2009。
- VanOosterom
范·奥斯特罗姆和斯特拉基。平面三角形的立体角。“IEEE生物医学工程学报”,2,1983,第125--126页。
示例
执行一些导入操作,并在多维数据集上获取一些点:
>>> import matplotlib.pyplot as plt >>> from scipy.spatial import SphericalVoronoi, geometric_slerp >>> from mpl_toolkits.mplot3d import proj3d >>> # set input data >>> points = np.array([[0, 0, 1], [0, 0, -1], [1, 0, 0], ... [0, 1, 0], [0, -1, 0], [-1, 0, 0], ])
计算球形Voronoi图:
>>> radius = 1 >>> center = np.array([0, 0, 0]) >>> sv = SphericalVoronoi(points, radius, center)
生成绘图:
>>> # sort vertices (optional, helpful for plotting) >>> sv.sort_vertices_of_regions() >>> t_vals = np.linspace(0, 1, 2000) >>> fig = plt.figure() >>> ax = fig.add_subplot(111, projection='3d') >>> # plot the unit sphere for reference (optional) >>> u = np.linspace(0, 2 * np.pi, 100) >>> v = np.linspace(0, np.pi, 100) >>> x = np.outer(np.cos(u), np.sin(v)) >>> y = np.outer(np.sin(u), np.sin(v)) >>> z = np.outer(np.ones(np.size(u)), np.cos(v)) >>> ax.plot_surface(x, y, z, color='y', alpha=0.1) >>> # plot generator points >>> ax.scatter(points[:, 0], points[:, 1], points[:, 2], c='b') >>> # plot Voronoi vertices >>> ax.scatter(sv.vertices[:, 0], sv.vertices[:, 1], sv.vertices[:, 2], ... c='g') >>> # indicate Voronoi regions (as Euclidean polygons) >>> for region in sv.regions: ... n = len(region) ... for i in range(n): ... start = sv.vertices[region][i] ... end = sv.vertices[region][(i + 1) % n] ... result = geometric_slerp(start, end, t_vals) ... ax.plot(result[..., 0], ... result[..., 1], ... result[..., 2], ... c='k') >>> ax.azim = 10 >>> ax.elev = 40 >>> _ = ax.set_xticks([]) >>> _ = ax.set_yticks([]) >>> _ = ax.set_zticks([]) >>> fig.set_size_inches(4, 4) >>> plt.show()
- 属性
- points双倍形状阵列(npoint,ndim)
中的点 ndim 用于生成Voronoi图的维度
- radius双倍
球体的半径
- center双倍形状数组(ndim,)
球体中心
- vertices双倍形状阵列(nverds,ndim)
与点对应的Voronoi顶点
- regions形状整数列表(npoint,_)
第n个条目是由属于第n个点(以点为单位)的折点索引组成的列表
方法:
calculate_areas
\()计算Voronoi区域的面积。