Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scipy: Centroid of convex hull

how can I calculate the centroid of a convex hull using python and scipy? All I found are methods for computing Area and Volume.

regards,frank.

like image 602
OD IUM Avatar asked Jul 22 '15 12:07

OD IUM


1 Answers

Assuming you have constructed the convex hull using scipy.spatial.ConvexHull, the returned object should then have the positions of the points, so the centroid may be as simple as,

import numpy as np
from scipy.spatial import ConvexHull

points = np.random.rand(30, 2)   # 30 random points in 2-D
hull = ConvexHull(points)

#Get centoid
cx = np.mean(hull.points[hull.vertices,0])
cy = np.mean(hull.points[hull.vertices,1])

Which you can plot as follows,

import matplotlib.pyplot as plt
#Plot convex hull
for simplex in hull.simplices:
    plt.plot(points[simplex, 0], points[simplex, 1], 'k-')

#Plot centroid
plt.plot(cx, cy,'x',ms=20)
plt.show()

The scipy convex hull is based on Qhull which should have method centrum, from the Qhull docs,

A centrum is a point on a facet's hyperplane. A centrum is the average of a facet's vertices. Neighboring facets are convex if each centrum is below the neighbor facet's hyperplane.

where the centrum is the same as a centroid for simple facets,

For simplicial facets with d vertices, the centrum is equivalent to the centroid or center of gravity.

As scipy doesn't seem to provide this, you could define your own in a child class to hull,

class CHull(ConvexHull):

    def __init__(self, points):
        ConvexHull.__init__(self, points)

    def centrum(self):

        c = []
        for i in range(self.points.shape[1]):
            c.append(np.mean(self.points[self.vertices,i]))

        return c

 hull = CHull(points)
 c = hull.centrum()
like image 72
Ed Smith Avatar answered Sep 22 '22 12:09

Ed Smith