如何在Python中正确计算多边形的质心?
正确计算多边形质心的方法
你当前用np.mean直接计算顶点坐标的平均值,得到的是顶点的几何中心,而非多边形的面积加权质心(形心),这就是结果不符的原因。多边形质心需要考虑每个顶点构成的小区域的面积权重,具体计算步骤和代码如下:
核心计算公式
对于按顺时针/逆时针顺序排列的多边形顶点$(x_1,y_1),(x_2,y_2),...,(x_n,y_n)$(首尾点重合),质心$(C_x,C_y)$的计算依赖于面积加权:
- 先计算多边形总面积$A$:
$A = \frac{1}{2} \sum_{i=0}^{n-2} (x_i y_{i+1} - x_{i+1} y_i)$ - 再计算质心坐标:
$C_x = \frac{1}{6A} \sum_{i=0}^{n-2} (x_i + x_{i+1})(x_i y_{i+1} - x_{i+1} y_i)$
$C_y = \frac{1}{6A} \sum_{i=0}^{n-2} (y_i + y_{i+1})(x_i y_{i+1} - x_{i+1} y_i)$
实现代码
import numpy as np points = np.array([(0,0), (70,0), (70,25), (45,45), (45,180), (95,188), (95,200), (-25,200), (-25, 188), (25,180), (25,45), (0,25), (0,0)]) # 提取坐标,去掉最后一个重复的首尾点 x = points[:-1, 0] y = points[:-1, 1] x_next = points[1:, 0] y_next = points[1:, 1] # 计算每个相邻顶点对的交叉项 cross_terms = x * y_next - x_next * y # 计算多边形面积 area = 0.5 * np.sum(cross_terms) # 计算质心坐标 centroid_x = (1 / (6 * area)) * np.sum((x + x_next) * cross_terms) centroid_y = (1 / (6 * area)) * np.sum((y + y_next) * cross_terms) print(f"Centroid: [{centroid_x:.4f}, {centroid_y:.4f}]")
输出结果
运行代码后会得到与预期一致的结果:
Centroid: [35.0000, 100.4615]
内容的提问来源于stack exchange,提问作者Victor Soares
相关产品推荐
相关产品推荐

