美文网首页
计算任意二维图形的重心

计算任意二维图形的重心

作者: Byte猫 | 来源:发表于2019-06-09 22:58 被阅读0次

三角形重心公式

假设 A,B,C 三点的坐标为(x_1,y_1),(x_2,y_2),(x_3,y_3),则其重心坐标(x_c,y_c)
x_c = \frac{x_1 + x_2 + x_3}{3}, y_c = \frac{y_1 + y_2 + y_3}{3}

多边形重心公式

平面多边形X_n可以被剖分为 n个有限的三角形X_1,X_2...X_n,这些简单图形的重心点为C_1,C_2...C_n,面积为A_1,A_2...A_n,设这个平面多边形的重心点坐标为(C_x,C_y),则
C_x=\frac{\sum_{i=1}^nC_{ix}A_{i}}{\sum_{i=1}^nA_i},C_y=\frac{\sum_{i=1}^nC_{iy}A_{i}}{\sum_{i=1}^nA_i}

1、对公式的理解

同计算多边形面积一样,我们可以给多边形进行三角剖分,以\sum_{i=1}^nA_i代表多边形的总面积,则:
多边形重心横坐标 = 多边形剖分的每一个三角形重心的横坐标 * 该三角形的面积之和 / 多边形总面积
多边形重心纵坐标 = 多边形剖分的每一个三角形重心的纵坐标 * 该三角形的面积之和 / 多边形总面积
所以这里就把问题拆分成了三个小问题:

  • 求每个剖分出来的三角形的重心。
  • 求每个剖分出来的三角形的面积。
  • 求多边形的面积。

2、代码实现

def get_centerpoint(locations):
    area = 0.0
    C_x,C_y = 0.0,0.0

    for i in range(len(locations)):
        lat = locations[i][0]  # 纬度
        lng = locations[i][1]  # 经度
 
        if i == len(locations)-1:
            lat1 = locations[0][0]
            lng1 = locations[0][1]
        else:
            lat1 = locations[i+1][0]
            lng1 = locations[i+1][1]
 
        fg = (lat*lng1 - lng*lat1)/2.0
 
        area += fg
        C_x += fg*(lat+lat1+0)/3.0
        C_y += fg*(lng+lng1+0)/3.0

    C_x = C_x/area
    C_y = C_y/area
 
    return C_x,C_y

if __name__ == '__main__':
    
    locations =  [[116.568627,39.994879],[116.564791,39.990511],[116.575012,39.984311]]    
    print(get_centerpoint(locations))

相关文章

网友评论

      本文标题:计算任意二维图形的重心

      本文链接:https://www.haomeiwen.com/subject/tbsmxctx.html