【面】计算任意二维图形的重心

三角形重心公式

假设 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、代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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))
0%