我正在尝试确定由一组RANDOM非等距间隔的x,y点确定的表面的质心。
这是一个快速测试集,可以显示我的意思。
from scipy.spatial import ConvexHull
import numpy as np
import matplotlib.pyplot as plt
def PolyArea(x, y):
return 0.5*np.abs(np.dot(x, np.roll(y,1))-np.dot(y, np.roll(x,1)))
points = np.random.rand(30, 2) # 30 random points in 2-D
hull = ConvexHull(points)
plt.plot(points[:,0], points[:,1])
for simplex in hull.simplices:
plt.plot(points[simplex, 0], points[simplex, 1])
plt.plot(points[hull.vertices, 0], points[hull.vertices, 1], 'r--', lw=2)
plt.show()
从这里我们得到:
x = points[hull.vertices, 0]
y = points[hull.vertices, 1]
surface_size = PolyArea(x, y)
我希望根据设置的点(x,y)而不是点的平均值来确定区域的质心。我知道这是通过表面的双积分计算的(请参见:http://tutorial.math.lamar.edu/Classes/CalcII/CenterOfMass.aspx),但是我不知道如何在Python中实现它。
提前致谢。
最佳答案
当然,有一个更为优雅的解决方案,但这是一种基于图像的快速而又肮脏的,可能是缓慢而过分的杀伤力,其工作原理。
import skimage.measure
import skimage.draw
GRIDW = 1000
GRIDH = 1000
img = np.zeros((GRIDW, GRIDH))
rr, cc = skimage.draw.polygon(x*GRIDW,y*GRIDH)
img[rr,cc] = 1
label = skimage.measure.label(img)
rprops = skimage.measure.regionprops(label)
print rprops[0].centroid / np.asarray([GRIDW, GRIDH])