{ } Raw JSON

bundles / scipy 1.17.1 / scipy / spatial / _spherical_voronoi / SphericalVoronoi

class

scipy.spatial._spherical_voronoi:SphericalVoronoi

source: /scipy/spatial/_spherical_voronoi.py :36

Signature

class   SphericalVoronoi ( points radius = 1 center = None threshold = 1e-06 )

Members

Summary

Voronoi diagrams on the surface of a sphere.

Extended Summary

Parameters

points : ndarray of floats, shape (npoints, ndim)

Coordinates of points from which to construct a spherical Voronoi diagram.

radius : float, optional

Radius of the sphere (Default: 1)

center : ndarray of floats, shape (ndim,)

Center of sphere (Default: origin)

threshold : float

Threshold for detecting duplicate points and mismatches between points and sphere parameters. (Default: 1e-06)

Attributes

points : double array of shape (npoints, ndim)

the points in ndim dimensions to generate the Voronoi diagram from

radius : double

radius of the sphere

center : double array of shape (ndim,)

center of the sphere

vertices : double array of shape (nvertices, ndim)

Voronoi vertices corresponding to points

regions : list of list of integers of shape (npoints, _ )

the n-th entry is a list consisting of the indices of the vertices belonging to the n-th point in points

Methods

calculate_areas

Calculates the areas of the Voronoi regions. For 2D point sets, the regions are circular arcs. The sum of the areas is 2 * pi * radius. For 3D point sets, the regions are spherical polygons. The sum of the areas is 4 * pi * radius**2.

Raises

: ValueError

If there are duplicates in points. If the provided radius is not consistent with points.

Notes

The spherical Voronoi diagram algorithm proceeds as follows. The Convex Hull of the input points (generators) is calculated, and is equivalent to their Delaunay triangulation on the surface of the sphere [Caroli]. The Convex Hull neighbour information is then used to order the Voronoi region vertices around each generator. The latter approach is substantially less sensitive to floating point issues than angle-based methods of Voronoi region vertex sorting.

Empirical assessment of spherical Voronoi algorithm performance suggests quadratic time complexity (loglinear is optimal, but algorithms are more challenging to implement).

Examples

Do some imports and take some points on a cube:
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import SphericalVoronoi, geometric_slerp
from mpl_toolkits.mplot3d import proj3d
points = np.array([[0, 0, 1], [0, 0, -1], [1, 0, 0],
                   [0, 1, 0], [0, -1, 0], [-1, 0, 0], ])
Calculate the spherical Voronoi diagram:
radius = 1
center = np.array([0, 0, 0])
sv = SphericalVoronoi(points, radius, center)
Generate plot:
sv.sort_vertices_of_regions()
t_vals = np.linspace(0, 1, 2000)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
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)
ax.scatter(points[:, 0], points[:, 1], points[:, 2], c='b')
ax.scatter(sv.vertices[:, 0], sv.vertices[:, 1], sv.vertices[:, 2],
                   c='g')
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()
fig-2317a6cca0ed708e.png

See also

Voronoi

Conventional Voronoi diagrams in N dimensions.

Aliases

  • scipy.spatial.SphericalVoronoi

Referenced by