栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

多边形质心计算 - Python实现

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多边形质心计算 - Python实现

先需要知道几个公式 一、对于 n 个离散的有质量数据点

假定顶点的坐标为 ( 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=1n​mi​∑i=1n​(xi​⋅mi​)​,Y=∑i=1n​mi​∑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​)​

三、求解步骤

有了以上公式后,对于求质量均匀分布的多边形质心(包括凹多边形)步骤可以如下:

  1. 将多边形分为多个三角形:确定多边形 ( n n n 个顶点) 的一个顶点,以这个点为基点,依次与其他顶点连线,得到 n − 2 n-2 n−2 个三角形
  2. 根据式 (2) 求解每个三角形的质心,根据式 (3) 求解质心,此时即得到了满足式 (1) 的情况,即多个离散的有质量 (用三角形面积表示,有正负,权值) 的数据点
  3. 根据式 (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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/467825.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号