一、不规则多边形重心求解
1.1 三角形重心计算方法
设三角形的三个顶点位置为A ( x 1 , y 1 ) A(x_1,y_1)A(x1,y1),B ( x 2 , y 2 ) B(x_2,y_2)B(x2,y2),C ( x 3 , y 3 ) C(x_3,y_3)C(x3,y3),那么△ A B C △ABC△ABC的重心G GG坐标为
x = x 1 + x 2 + x 3 3 , y = y 1 + y 2 + y 3 3 x=\frac{x_1+x_2+x_3}{3}, y=\frac{y_1+y_2+y_3}{3}x=3x1+x2+x3,y=3y1+y2+y3
1.2 三角形面积计算方法
计算三角形的面积使用向量积的方式,下图中,假设P点为原点,A ( x 1 , y 1 ) A(x_1,y_1)A(x1,y1),B ( x 2 , y 2 ) B(x_2,y_2)B(x2,y2)。
以A AA,B BB和坐标原点P PP构成的△ A B C △ABC△ABC的面积为
S = P B ⃗ × P A ⃗ 2 = x 2 y 1 − x 1 y 2 2 S=\frac{\vec{PB}\times \vec{PA}}{2}=\frac{x_2y_1-x_1y_2}{2}S=2PB×PA=2x2y1−x1y2
1.3 多边形面积的计算方法
对于多边形的情况,我们可以将多边形切分为多个三角形,分别进行求解。那么这个剖分点$ P$ 我们可以设在哪里呢?这里先给出结论:这个剖分点可以设置在多边形的内部,也可以设置到外部。
为什么这个剖分点可以设置到外部呢?我们可以通过简单的三角形情况来推广到多边形的情况。 对于△ A B C △ABC△ABC,我们把剖分点设置在其外部$ P$ 的一点上,
△ A B C △ABC△ABC的面积S SS为
S = 1 2 ( P B ⃗ × P C ⃗ + P C ⃗ × P A ⃗ + P A ⃗ × P B ⃗ ) S=\frac{1}{2}(\vec{PB}\times \vec{PC}+\vec{PC}\times \vec{PA}+\vec{PA}\times \vec{PB})S=21(PB×PC+PC×PA+PA×PB)
设P ( x 0 , y 0 ) , P(x_0,y_0),P(x0,y0),A ( x 1 , y 1 ) A(x_1,y_1)A(x1,y1),B ( x 2 , y 2 ) B(x_2,y_2)B(x2,y2),C ( x 3 , y 3 ) C(x_3,y_3)C(x3,y3)
△ A B C △ABC△ABC的面积S SS可以写为
S = 1 2 ( x 1 y 2 − x 2 y 1 + x 2 y 3 − x 3 y 2 + x 3 y 1 − x 1 y 3 ) S=\frac{1}{2}\left ( x_1y_2-x_2y_1+x_2y_3-x_3y_2+x_3y_1-x_1y_3\right )S=21(x1y2−x2y1+x2y3−x3y2+x3y1−x1y3)
这时可以发现跟外部点P PP没有关系,只跟顶点的坐标有关系。
1.4 不规则多边形的重心计算方法
不规则图形一般没有中心点这个概念,所以只能使用重心来代替中心点,这里先给出一个公式:
平面多边形X XX可以被剖分为n nn个有限的简单图形X 1 , X 2 , … , X n X_1,X_2,…,X_nX1,X2,…,Xn,这些简单图形的重心点为G i G_iGi,面积为S i S_iSi,那么这个平面多边形的重心点坐标G ( x , y ) G(x,y)G(x,y)为
x = ∑ n i = 1 G i x S i ∑ i = 1 n S i , y = ∑ n i = 1 G i y S i ∑ i = 1 n S i x=\frac{\sum_{n}^{i=1}G_{ix}S_i}{\sum_{i=1}^{n} S_i},y=\frac{\sum_{n}^{i=1}G_{iy}S_i}{\sum_{i=1}^{n} S_i}x=∑i=1nSi∑ni=1GixSi,y=∑i=1nSi∑ni=1GiySi
- 不规则多边形重心计算
def get_gravity_point(points):
"""
@brief 获取多边形的重心点
@param points The points
@return The center of gravity point.
"""
if len(points) <= 2:
return list()
area = Decimal(0.0)
x, y = Decimal(0.0), Decimal(0.0)
for i in range(len(points)):
lng = Decimal(points[i][0])
lat = Decimal(points[i][1])
nextlng = Decimal(points[i-1][0])
nextlat = Decimal(points[i-1][1])
tmp_area = (nextlng*lat - nextlat*lng)/Decimal(2.0)
area += tmp_area
x += tmp_area*(lng+nextlng)/Decimal(3.0)
y += tmp_area*(lat+nextlat)/Decimal(3.0)
x = x/area
y = y/area
return [float(x), float(y)]