Python scipy.spatial 模块,Voronoi() 实例源码

我们从Python开源项目中,提取了以下12个代码示例,用于说明如何使用scipy.spatial.Voronoi()

项目:kingfisher    作者:peixian    | 项目源码 | 文件源码
def __init__(self, points = np.array([]), dimensions = (None, None), granularity = None):
        """
        Creates the Voronoi object

        :param points: predefined points
        :type points: numpy array of shape (w, 2) where w is the number of points [x, y] style, default None
        :param dimensions: dimensions of the points, from [w, 2] where w is the highest value, this *cannot* be None if points is None
        :type dimensions: tuple of ints, maximum (x,y) dimensions, default None
        :param granularity: how many points to create, must be given if dimensions are given
        :type granularity: int, default None
        """
        if len(points) == 0 and dimensions == (None, None):
            print('You can\'t have both points and dimensions be empty, try passing in some points or dimensions and granularity.')
            return
        if len(points) == 0 and dimensions != None and granularity == None:
            print('Granularity can\'t be none if dimensions are passed in, try passing in a granularity.')
            return
        if len(points) != 0:
            self.points = points
        else:
            points = np.random.random((granularity, 2))
            points = list(map(lambda x: np.array([x[0]*dimensions[0], x[1]*dimensions[1]]), points))
            self.points = np.array(points)
        self.bounding_region = [min(self.points[:, 0]), max(self.points[:, 0]), min(self.points[:, 1]), max(self.points[:, 1])]
项目:kingfisher    作者:peixian    | 项目源码 | 文件源码
def _region_centroid(self, vertices):
        """
        Finds the centroid of the voronoi region bounded by given vertices
        See: https://en.wikipedia.org/wiki/Centroid#Centroid_of_polygon

        :param vertices: list of vertices that bound the region
        :type vertices: numpy array of vertices from the scipy.spatial.Voronoi.regions (e.g. vor.vertices[region + [region[0]], :])

        :return: list of centroids
        :rtype: np.array of centroids
        """
        signed_area = 0
        C_x = 0
        C_y = 0
        for i in range(len(vertices)-1):
            step = (vertices[i, 0]*vertices[i+1, 1])-(vertices[i+1, 0]*vertices[i, 1])
            signed_area += step
            C_x += (vertices[i, 0] + vertices[i+1, 0])*step
            C_y += (vertices[i, 1] + vertices[i+1, 1])*step
        signed_area = 1/2*signed_area
        C_x = (1.0/(6.0*signed_area))*C_x
        C_y = (1.0/(6.0*signed_area))*C_y
        return np.array([[C_x, C_y]])
项目:kingfisher    作者:peixian    | 项目源码 | 文件源码
def relax_points(self, times=1):
        """
        Relaxes the points after an initial Voronoi is created to refine the graph.
        See: https://stackoverflow.com/questions/17637244/voronoi-and-lloyd-relaxation-using-python-scipy

        :param times: Number of times to relax, default is 1
        :type times: int

        :return: the final voronoi diagrama
        :rtype: scipy.spatial.Voronoi
        """
        for i in range(times):
            centroids = []
            for region in self.filtered_regions:
                vertices = self.vor.vertices[region + [region[0]], :]
                centroid = self._region_centroid(vertices)
                centroids.append(list(centroid[0, :]))
            self.points = centroids
            self.generate_voronoi()
        return self.vor
项目:CHaMP_Metrics    作者:SouthForkResearch    | 项目源码 | 文件源码
def generate_voronoi(geoseries_polygons):
    """Generate Voronoi polygons from polygon edges
    :param geoseries_polygons: GeoSeries of raw polygons
    :return:
    """
    edges = geoseries_polygons.unary_union.boundary
    pnts = points_along_boundaries(edges, 0.75)
    cent = pnts.centroid
    tpnts = translate(pnts, -cent.x, -cent.y)
    vor = Voronoi(tpnts)
    polys = []
    for region in vor.regions:
        if len(region) > 0 and all([i > 0 for i in region]):
            polys.append(Polygon([vor.vertices[i] for i in region]))
    gs_vor = geopandas.GeoSeries(polys)
    t_gs_vor = gs_vor.translate(cent.x, cent.y)
    t_gs_vor.crs = geoseries_polygons.crs
    return t_gs_vor, pnts
项目:Graphene    作者:ashivni    | 项目源码 | 文件源码
def vorEdges(vor, far):
    """
    Given a voronoi tesselation, retuns the set of voronoi edges.
    far is the length of the "infinity" edges
    """
    edges = []
    for simplex in vor.ridge_vertices:
        simplex = numpy.asarray(simplex)
        if numpy.all(simplex >= 0):
            edge = {}
            edge['p1'], edge['p2'] = vor.vertices[simplex, 0], vor.vertices[simplex, 1]
            edge['p1'] = numpy.array([vor.vertices[simplex, 0][0], vor.vertices[simplex, 1][0]])
            edge['p2'] = numpy.array([vor.vertices[simplex, 0][1], vor.vertices[simplex, 1][1]])
            edge['t'] = (edge['p2'] - edge['p1']) / numpy.linalg.norm(edge['p2'] - edge['p1'])
            edges.append(edge)

    ptp_bound = vor.points.ptp(axis=0)
    center = vor.points.mean(axis=0)
    for pointidx, simplex in zip(vor.ridge_points, vor.ridge_vertices):
        simplex = numpy.asarray(simplex)
        if numpy.any(simplex < 0):
            i = simplex[simplex >= 0][0]  # finite end Voronoi vertex

            t = vor.points[pointidx[1]] - vor.points[pointidx[0]]  # tangent
            t /= numpy.linalg.norm(t)
            n = numpy.array([-t[1], t[0]])  # normal

            midpoint = vor.points[pointidx].mean(axis=0)
            direction = numpy.sign(numpy.dot(midpoint - center, n)) * n

            far_point = vor.vertices[i] + direction * ptp_bound.max() * far
            edge = {}
            edge['p1'], edge['p2'] = numpy.array([vor.vertices[i, 0], far_point[0]]), numpy.array(
                [vor.vertices[i, 1], far_point[1]])
            edge['p1'], edge['p2'] = vor.vertices[i, :], far_point
            edge['t'] = (edge['p2'] - edge['p1']) / numpy.linalg.norm(edge['p2'] - edge['p1'])
            edges.append(edge)
    return edges
项目:Auspex    作者:BBN-Q    | 项目源码 | 文件源码
def phase_diagram_mesh(points, values,
                                title="Phase diagram",
                                xlabel="Pulse Duration (s)",
                                ylabel="Pulse Amplitude (V)",
                                shading="flat",
                                voronoi=False, **kwargs):
    # fig = plt.figure()
    if voronoi:
        from scipy.spatial import Voronoi, voronoi_plot_2d
        points[:,0] *= 1e9
        vor = Voronoi(points)
        cmap = mpl.cm.get_cmap('RdGy')
        # colorize
        for pr, v in zip(vor.point_region, values):
            region = vor.regions[pr]
            if not -1 in region:
                polygon = [vor.vertices[i] for i in region]
                plt.fill(*zip(*polygon), color=cmap(v))
    else:
        mesh = scaled_Delaunay(points)
        xs = mesh.points[:,0]
        ys = mesh.points[:,1]
        plt.tripcolor(xs,ys,mesh.simplices.copy(),values, cmap="RdGy",shading=shading,**kwargs)
    plt.xlim(min(xs),max(xs))
    plt.ylim(min(ys),max(ys))
    plt.title(title, size=18)
    plt.xlabel(xlabel, size=16)
    plt.ylabel(ylabel, size=16)
    cb = plt.colorbar()
    cb.set_label("Probability",size=16)
    return mesh
项目:order    作者:ipudu    | 项目源码 | 文件源码
def polyhedron(self, coords, j, L):
        """find the polyhedron for center molecule"""
        vor = Voronoi(coords)
        #get the vertices
        points = [vor.vertices[x] for x in vor.regions[vor.point_region[j]] if x != -1]
        return points
项目:order    作者:ipudu    | 项目源码 | 文件源码
def compute_vc(self, points):
        """compute the Voronoi cell"""
        #compute S and V
        S = ConvexHull(points).area
        V = ConvexHull(points).volume

        #voronoi cell
        eta = S ** 3 / (36 * np.pi * V ** 2)

        return eta
项目:order    作者:ipudu    | 项目源码 | 文件源码
def asphericity(self, freq = 1):
        """compute asphericity of the Voronoi cell"""
        #progress bar
        frames = int(self.traj.n_frames / freq)
        bar = ChargingBar('Processing', max=frames, 
        suffix='%(percent).1f%% - %(eta)ds')

        for i in range(0, self.traj.n_frames, freq):
            for j in range(self.traj.n_atoms):
                if self.traj.atom_names[i][j] == self.center:
                    #center coordinate
                    c = self.traj.coords[i][j]

                    #coordinates
                    cs = self.traj.coords[i]

                    #box_size
                    L = self.traj.box_size[i]

                    #new coordinates after wrapping
                    nc = self.wrap_box(c, cs, L)
                    points = self.polyhedron(nc, j, L)
                    e = self.compute_vc(points)
                    self.raw.append(e)
            bar.next()
        bar.finish()
项目:crowddynamics    作者:jaantollander    | 项目源码 | 文件源码
def density_voronoi_2(points, cell_size):
    r"""Density definition base on Voronoi-diagram. [Steffen2010]_

    Compute Voronoi-diagram for each position :math:`\mathbf{p}_i` giving
    cells :math:`A_i` to each agent :math:`i`. Area of Voronoi cell is
    denoted :math:`|A_i|`. Area :math:`A` is the area inside which we
    measure the density.

    :math:`S = \{i : \mathbf{p}_i \in A\}` is the set of agents and
    :math:`N = |S|` the number of agents that is inside area :math:`A`.

    .. math::
        D_{V^\prime} = \frac{N}{\sum_{i \in S} |A_i|}

    Args:
        points (numpy.ndarray):
            Two dimensional points :math:`\mathbf{p}_{i \in \mathbb{N}}`
        cell_size (float):
            Cell size of the meshgrid. Each cell represents an area :math:`A`
            inside which density is measured.

    Returns:
        numpy.ndarray: Grid of values density values for each cell.

    """
    # Voronoi tesselation
    vor = Voronoi(points)
    new_regions, new_vertices = voronoi_finite_polygons_2d(vor)

    # Compute areas for all of the Voronoi regions
    area = np.array([polygon_area(new_vertices[i]) for i in new_regions])

    return _core_2(points, cell_size, area, vor.point_region)
项目:kingfisher    作者:peixian    | 项目源码 | 文件源码
def generate_voronoi(self):
        """
        Uses scipy.spatial.Voronoi to generate a voronoi diagram.
        Filters viable regions and stashes them in filtered_regions, see https://stackoverflow.com/questions/28665491/getting-a-bounded-polygon-coordinates-from-voronoi-cells

        :return: A voronoi diagram based on the points
        :rtype: scipy.spatial.Voronoi
        """
        eps = sys.float_info.epsilon
        self.vor = Voronoi(self.points)
        self.filtered_regions = []
        for region in self.vor.regions:
            flag = True
            for index in region:
                if index == -1:
                    flag = False
                    break
                else:
                    x = self.vor.vertices[index, 0]
                    y = self.vor.vertices[index, 1]
                    if not (self.bounding_region[0] - eps <= x and x <= self.bounding_region[1] + eps and
                            self.bounding_region[2] - eps <= y and y <= self.bounding_region[3] + eps):
                        flag = False
                        break
            if region != [] and flag:
                self.filtered_regions.append(region)
        return self.vor
项目:pyhiro    作者:wanweiwei07    | 项目源码 | 文件源码
def medial_axis(samples, contains):
    '''
    Given a set of samples on a boundary, find the approximate medial axis based
    on a voronoi diagram and a containment function which can assess whether
    a point is inside or outside of the closed geometry. 

    Arguments
    ----------
    samples:    (n,d) set of points on the boundary of the geometry
    contains:   function which takes (m,d) points and returns an (m) bool array

    Returns
    ----------
    lines:     (n,2,2) set of line segments
    '''

    from scipy.spatial import Voronoi
    from .path.io.load import load_path

    # create the voronoi diagram, after vertically stacking the points
    # deque from a sequnce into a clean (m,2) array
    voronoi = Voronoi(samples)
    # which voronoi vertices are contained inside the original polygon
    contained = contains(voronoi.vertices)
    # ridge vertices of -1 are outside, make sure they are False
    contained = np.append(contained, False)
    inside = [i for i in voronoi.ridge_vertices if contained[i].all()]
    line_indices = np.vstack([stack_lines(i) for i in inside if len(i) >=2])
    lines = voronoi.vertices[line_indices]    
    return load_path(lines)