多边形面积计算及顶点顺-逆时针方向判断

格林(Green)公式告诉我们,在平面闭区域D上的二重积分可以通过沿闭区域D的边界曲线L上的曲线积分来表达。即,设闭区域D由分段光滑的曲线L围成,函数P(x,y)Q(x,y)D上具有一阶连续偏导数,则有D(QxPy)dxdy=LPdx+Qdy其中LD的取正向的边界曲线。根据公式推导过程(参考高等数学同济版下),有如下关系存在:DPydxdy=LPdxDQxdxdy=LQdy

对于上面两个式子,分别取P=yQ=x可得到:(1)Ddxdy=A=Lydx(2)Ddxdy=A=Lxdy

其中,A为闭区域D的面积。根据式(1)和(2)也可得出:A=12Lxdyydx

根据公式(2)来计算多边形面积,参考下面的示意图,曲线L由多段光滑的直线段Li连接而成。由于L是分段光滑的,则有向曲线L上对坐标的曲线积分等于在光滑的各段上对坐标的曲线积分之和。即A=Lxdy=L0xdy+...+L6xdy

 

直线段Li从点(xi,yi)到点(xi+1,yi+1)的参数方程为Li(t)=((xi+1xi)t+xi,(yi+1yi)t+yi),0t1,于是对线段Li的坐标积分为:Lixdy=01((xi+1xi)t+xi)(yi+1yi)dt=(yi+1yi)(xit+12t2(xi+1xi))|01=12(xi+1+xi)(yi+1yi)

将每段结果相加得到多边形的面积为:A=i=0n(xi+1+xi)(yi+1yi)2

其中,n为多边形顶点数-1,(xn+1,yn+1)=(x0,y0)。类似的,根据公式(1)可计算出多边形的面积为:A=i=0n(xixi+1)(yi+yi+1)2

多边形面积和顶点数组的顺-逆时针方向可以根据上面的公式计算,即如果是逆时针(L为正向),则计算出的面积为正值;如果是顺时针,计算出的面积为负值。可参考下面的代码:

复制代码
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

def isCounterclockwise(points):
    s = 0
    points_count = len(points)
    for i in range(points_count):
        point = points[i]
        point2 = points[(i + 1) % points_count]
        s += (point.x - point2.x) * (point.y + point2.y)
    return s > 0


def poly_area(points):
    s = 0
    points_count = len(points)
    for i in range(points_count):
        point = points[i]
        point2 = points[(i + 1) % points_count]
        s += (point.x - point2.x) * (point.y + point2.y)
    return abs(s/2)


if __name__ == "__main__":
    polygon1 = [Point(0,0), Point(0.5,0), Point(0.5,0.5), Point(0,1)] # counter-clockwise
    polygon2 = polygon1[::-1]  # clockwise
    print(isCounterclockwise(polygon1), isCounterclockwise(polygon2)) # True, False
    print(poly_area(polygon1)) # 0.375
复制代码

 

 

 

参考:

Shoelace formula

A formula for the area of a polygon

判断多边形边界曲线顺/逆时针 两种方法

如何判断一个多边形的环是逆时针还是顺时针

判断多边形顺时针还是逆时针--根据多边形面积正负

格林公式的几何意义是什么?

posted @   XXX已失联  阅读(1497)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2016-12-02 数字滤波器
点击右上角即可分享
微信分享提示