scipy.spatial.
SphericalVoronoi#
- class scipy.spatial.SphericalVoronoi(points, radius=1, center=None, threshold=1e-06)[源代码]#
球面上 的Voronoi图。
在 0.18.0 版本中添加。
- 参数:
- points浮点数 ndarray,形状 (npoints, ndim)
用于构建球面 Voronoi 图的点的坐标。
- radius浮点数,可选
球的半径(默认值:1)
- center浮点数 ndarray,形状 (ndim,)
球的中心(默认值:原点)
- threshold浮点数
用于检测重复点以及点和球面参数之间不匹配的阈值。(默认值:1e-06)
- 引发:
- ValueError
如果 points 中存在重复项。如果提供的 radius 与 points 不一致。
另请参阅
Voronoi
N 维空间中的传统 Voronoi 图。
说明
球面 Voronoi 图算法按以下步骤进行。计算输入点(生成器)的凸包,这等效于它们在球面上的 Delaunay 三角剖分 [Caroli]。然后,使用凸包邻居信息来排序每个生成器周围的 Voronoi 区域顶点。后一种方法对浮点问题不如基于角度的 Voronoi 区域顶点排序方法敏感。
对球面 Voronoi 算法性能的经验评估表明,其时间复杂度为二次方(对数线性是最佳的,但算法的实现更具挑战性)。
参考文献
[Caroli]Caroli 等人。球面上或靠近球面的点的鲁棒高效 Delaunay 三角剖分。研究报告 RR-7004, 2009。
[VanOosterom]Van Oosterom 和 Strackee。平面三角形的立体角。IEEE 生物医学工程学报,2, 1983, pp 125–126。
示例
做一些导入,并在立方体上取一些点
>>> import numpy as np >>> 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形状为 (npoints, ndim) 的双精度数组
用于生成 Voronoi 图的 ndim 维中的点
- radius双精度数
球的半径
- center形状为 (ndim,) 的双精度数组
球的中心
- vertices形状为 (nvertices, ndim) 的双精度数组
与点对应的 Voronoi 顶点
- regions形状为 (npoints, _ ) 的整数列表的列表
第 n 个条目是由属于 points 中第 n 个点的顶点的索引组成的列表
方法
计算 Voronoi 区域的面积。