Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Voronoi Diagram Edges: How to get edges in the form (point1, point2) from a scipy.spatial.Voronoi object?

I have spent a great deal of time now trying to obtain edges from the scipy.spatial.Voronoi diagram to no avail. Here is the main documentation: http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.spatial.Voronoi.html

If you create a Voronoi Diagram like so:

points = np.array([[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2],
[2, 0], [2, 1], [2, 2]]) //Or feel free to use any set of points

then you have access to the following object properties:

vor.regions
vor.max_bound
vor.ndim
vor.ridge_dict
vor.ridge_points
vor.ridge_vertices
vor.npoints
vor.point_region
vor.points

But is unclear how to combine these to get edges in the form (point1, point2) for 2d voronoi diagrams? I know edges exist because you can plot the voronoi diagram and its edgres and vertices because you can do the following:

voronoi_plot_2d(vor)
plt.show()

enter image description here

which clearly depicts voronoi edgres - how to get a list of them and their starting and endpoints? Its okay if I only get the solid edges (not the dotted ones which go unbounded off the plot)

like image 884
cgnorthcutt Avatar asked May 14 '14 15:05

cgnorthcutt


People also ask

What is edge in Voronoi diagram?

We know that the intersection of any number of half-planes forms a convex region bounded by a set of connected line segments. These line segments form the boundaries of Voronoi regions and are called Voronoi edges. The endpoints of these edges are called Voronoi vertices.

How many edges does a Voronoi diagram have?

A voronoi diagram has the following properties: Voronoi Diagram is a planar graph where every vertex is of degree 3. For 'n' sites, there are 'n' faces at most 2n-5 vertices, and at most 3n-6 edges. Sites in the unbounded voronoi cells correspond to the vertices on the convex hull.

What is Scipy spatial in Python?

scipy. spatial can compute triangulations, Voronoi diagrams, and convex hulls of a set of points, by leveraging the Qhull library. Moreover, it contains KDTree implementations for nearest-neighbor point queries, and utilities for distance computations in various metrics.


1 Answers

Take a look at the ridge_vertices attribute:

    ridge_vertices  (list of list of ints, shape (nridges, *))
        Indices of the Voronoi vertices forming each Voronoi ridge.

Each element in that list is a pair of integers. Each integer is an index into the vertices list. So each element defines a line to be draw in the Voronoi diagram. An index of -1 means a point that is "at infinity".

Here's script that draws the lines of the Voronoi diagram:

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


points = np.array([[0, 0], [0, 1], [0, 2],
                   [1, 0], [1, 1], [1, 2],
                   [2, 0], [2, 1], [2, 2]])

vor = Voronoi(points)


fig = plt.figure()

# Mark the Voronoi vertices.
plt.plot(vor.vertices[:,0], vor.vertices[:, 1], 'ko', ms=8)

for vpair in vor.ridge_vertices:
    if vpair[0] >= 0 and vpair[1] >= 0:
        v0 = vor.vertices[vpair[0]]
        v1 = vor.vertices[vpair[1]]
        # Draw a line from v0 to v1.
        plt.plot([v0[0], v1[0]], [v0[1], v1[1]], 'k', linewidth=2)

plt.show()

It creates:

Voronoi edges

like image 63
Warren Weckesser Avatar answered Sep 22 '22 18:09

Warren Weckesser