from shapely.geometry import Polygonclass Point:def __init__(self, x, y):self.x = xself.y = ydef __repr__(self):return str([self.x, self.y])#多边形标准化
def polygonTransform(P):return [Point(p[0], p[1]) for p in P]#计算多边形的面积官方
def calculateAreaOffice(P):p = Polygon([(p.x, p.y) for p in P])return p.area#计算多边形的面积,鞋带公式,可用于计算简单多边形
def calculateArea(P):p0, plast = P[0], P[-1]#把起点补充为终点if p0.x != plast.x or p0.y != plast.y:P.append(p0)area = 0for i in range(len(P)-1):xi, yi, xj, yj = P[i].x, P[i].y, P[i+1].x, P[i+1].yarea += 0.5*(yi+yj)*(xi-xj)return abs(area)#计算三角形面积
def calculateAreaTriangle(a, b, c):ab = [b.x-a.x, b.y-a.y]ac = [c.x-a.x, c.y-a.y]return 0.5*abs(ab[0]*ac[1]-ab[1]*ac[0])#计算多边形面积,拆成三角形的和,只适用于凸多边形
def calculateAreaConvex(P):return sum([calculateAreaTriangle(P[0], P[i], P[i+1]) for i in range(1, len(P)-2)])#多边形面积计算case
def case():LP = []LP.append([[0, 0], [1, 0], [1, 1], [0, 1]])LP.append([[0, 0], [1, 0], [1, 1]])LP.append([[0, 0], [2, 0], [1, 1], [0, 0]])LP.append([[3, 4], [5, 11], [12, 8], [9, 5], [5, 6]]) #凹多边形LP = [polygonTransform(P) for P in LP]return LPif __name__ == '__main__':P = case()[3]#0-计算多边形的面积官方print(calculateAreaOffice(P))#1-计算多边形的面积,鞋带公式,可用于计算简单多边形,推荐使用print(calculateArea(P))#2-计算多边形面积,拆成三角形的和,仅适用于凸多边形print(calculateAreaConvex(P))