假定顶点的坐标为 ( x i , y i ) (x_i, y_i) (xi,yi),质量为 m i m_i mi,则质心为:
X = ∑ i = 1 n ( x i ⋅ m i ) ∑ i = 1 n m i , Y = ∑ i = 1 n ( y i ⋅ m i ) ∑ i = 1 n m i . . . ( 1 ) X = frac{sum_{i=1}^n ( x_i cdot m_i )} {sum_{i=1}^n m_i}, Y = frac{sum_{i=1}^n ( y_i cdot m_i )} {sum_{i=1}^n m_i} ...(1) X=∑i=1nmi∑i=1n(xi⋅mi),Y=∑i=1nmi∑i=1n(yi⋅mi)...(1)
二、对于质量均匀分布的三角形-
三角形的质心
x 0 + x 1 + x 2 3 , Y = y 0 + y 1 + y 2 3 . . . ( 2 ) frac{x_0 + x_1 + x_2} {3},Y = frac{y_0 + y_1 + y_2} {3} ...(2) 3x0+x1+x2,Y=3y0+y1+y2...(2) -
三角形的面积
( x 1 − x 0 ) ⋅ ( y 2 − y 0 ) − ( x 2 − x 0 ) ⋅ ( y 1 − y 0 ) 2 frac{(x_1 - x_0) cdot (y_2 - y_0) - (x_2 - x_0) cdot (y_1 - y_0)} {2} 2(x1−x0)⋅(y2−y0)−(x2−x0)⋅(y1−y0)
有了以上公式后,对于求质量均匀分布的多边形质心(包括凹多边形)步骤可以如下:
- 将多边形分为多个三角形:确定多边形 ( n n n 个顶点) 的一个顶点,以这个点为基点,依次与其他顶点连线,得到 n − 2 n-2 n−2 个三角形
- 根据式 (2) 求解每个三角形的质心,根据式 (3) 求解质心,此时即得到了满足式 (1) 的情况,即多个离散的有质量 (用三角形面积表示,有正负,权值) 的数据点
- 根据式 (1) 求得的解即为多边形的质心
python实现
def calculate_centroid(point_list, times=1000):
if len(point_list)>=3:
c_s = []
X = 0
Y = 0
for time in range(times):
# 找出多边形中包含的多个三角形,计算其质心以及面积
original_point = point_list[random.randint(0, len(point_list)-1)]
# print("point", original_point)
for point_index in range(0, len(point_list) - 1):
# 划分出 n-2 个三角形
coordinates = (original_point, point_list[point_index], point_list[point_index+1])
# 排除面积为 0 的组合
a = (coordinates[1][0]-coordinates[0][0]) * (coordinates[2][1]-coordinates[0][1])
b = (coordinates[2][0]-coordinates[0][0]) * (coordinates[1][1]-coordinates[0][1])
s = abs((a - b) / 2)
if s == 0:
continue
else:
x = (coordinates[0][0] + coordinates[1][0] + coordinates[2][0]) / 3
y = (coordinates[0][1] + coordinates[1][1] + coordinates[2][1]) / 3
coordinate = (x, y)
c_s.append([coordinate, s])
x_sum = 0
y_sum = 0
s_sum = 0
for sample in c_s:
coordinate, s = sample
x, y = coordinate
x_sum += x*s
y_sum += y*s
s_sum += s
X += x_sum/s_sum
Y += y_sum/s_sum
return X/times, Y/times



