python - 从一组 x、y 坐标计算表面的质心

标签 python numpy scipy area surface

我正在尝试确定由一组随机非等距 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])

关于python - 从一组 x、y 坐标计算表面的质心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50039064/

相关文章:

python - 如何使用 twitter API V2 从用户推文时间轴获取源视频 URL

python - 默认安装的 Redis Python 模块

python - 在Python中找到大稀疏矩阵的2个最大特征值

python - Numpy argsort 与 Scipy.stats 排名数据

python - 在 numpy 中堆叠数组

PYTHON:如何创建一个函数来比较两个列表中重复出现的单词?

python - NumPy 数组交集的索引

python - KMeans 向量化实现更新集群质心。 Numpy 专业版

python - Pandas 交叉表中的加权结果

python - Python 中最快的 2D 卷积或图像过滤器