一、不规则多边形重心求解
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 G G坐标为
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
A
A,
B
B
B和坐标原点
P
P
P构成的
△
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
S
S为
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
S
S可以写为
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 P P没有关系,只跟顶点的坐标有关系。
1.4 不规则多边形的重心计算方法
不规则图形一般没有中心点这个概念,所以只能使用重心来代替中心点,这里先给出一个公式:
平面多边形
X
X
X可以被剖分为
n
n
n个有限的简单图形
X
1
,
X
2
,
…
,
X
n
X_1,X_2,…,X_n
X1,X2,…,Xn,这些简单图形的重心点为
G
i
G_i
Gi,面积为
S
i
S_i
Si,那么这个平面多边形的重心点坐标
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)]