不规则多边形重心求解

一、不规则多边形重心求解

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 =2x2y1x1y2

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(x1y2x2y1+x2y3x3y2+x3y1x1y3)

这时可以发现跟外部点 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=1nSini=1GixSi,y=i=1nSini=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)]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值