Python计算任意多边形面积算法

时间:2023-01-08 10:54:53

     多边形面积求解的方法很多,其中比较多见的就是增加一个点P,然后分别连接多边形各个定点与P点,然后计算每个三角形的符号面积(面积有正负之分),求和就可以计算出面积。

Python计算任意多边形面积算法

      鉴于上面的方法,我们也可以用另外一种更简单的方法,将P点直接放在V0点,那么我们要求的面积就是V0V1V2,VoV2V3,...,V0Vn-2Vn-3的面积和。此处注意,如果我们假设逆时针的三角形(如上图V0V2V3)为正,那么顺时针的面积(如上图V0V1V2)就为负。


代码如下:

#-------------------------------------------------------------------------------
# Name:        多边形面积计算
# Purpose:
#
# Author:      Administrator
#
# Created:     20-02-2013
# Copyright:   (c) Administrator 2013
# Licence:     <your licence>
#-------------------------------------------------------------------------------
import math


class Point():
    def __init__(self,x,y):
        self.x = x
        self.y = y


def GetAreaOfPolyGon(points):
    '''计算多边形面积值
       points:多边形的点集,每个点为Point类型
       返回:多边形面积'''
    area = 0
    if(len(points)<3):
        raise Exception("至少需要3个点才有面积")
    p1 = points[0]
    for i in range(1,len(points)-1):
        p2 = points[1]
        p3 = points[2]
        #计算向量
        vecp1p2 = Point(p2.x - p1.x,p2.y - p1.y)
        vecp2p3 = Point(p3.x - p2.x,p3.y - p2.y)
        #判断顺时针还是逆时针,顺时针面积为正,逆时针面积为负
        vecMult = vecp1p2.x*vecp2p3.y - vecp1p2.y*vecp2p3.x


        sign = 0
        if(vecMult>0):
            sign = 1
        elif(vecMult < 0):
            sign = -1


        triArea = GetAreaOfTriangle(p1,p2,p3)*sign
        area+=triArea


    return abs(area)


def GetAreaOfTriangle(p1,p2,p3):
    '''计算三角形面积'''
    area = 0
    p1p2 = GetLineLength(p1,p2)
    p2p3 = GetLineLength(p2,p3)
    p3p1 = GetLineLength(p3,p1)
    s = (p1p2 + p2p3 + p3p1)/2
    area = s*(s-p1p2)*(s-p2p3)*(s-p3p1)
    area = math.sqrt(area)
    return area


def GetLineLength(p1,p2):
    '''计算边长'''
    length = math.pow((p1.x-p2.x),2) + math.pow((p1.y-p2.y),2)
    length = math.sqrt(length)
    return length


def main():
    p1 = Point(1,1)
    p2 = Point(2,1)
    p3 = Point(2,2)
    p4 = Point(1,2)
    points = [p1,p2,p3,p4]
    area = GetAreaOfPolyGon(points)
    print(math.ceil(area))
    assert math.ceil(area)==1


if __name__ == '__main__':
    main()