不规则多边形区域的面积计算算法

最近在写一个显微图像分析处理方面的程序,里面有一个功能是计算一个不规则的多边形区域的面积。因此花了点时间研究这个算法该如何写。研究了一番之后,算是找到了个比较靠谱的算法。这里就简单的写写自己的研究成果。

解决这个问题,需要点线性代数和矢量运算方面的知识。以下图为例,设三角形的三个顶点为 a,b,c,坐标分别为 (xa,ya),(xb,yb),(xc,yc)。

给出不规则五边形的逆时针点画出图形python 不规则五边形求面积_bc

那么三角形的面积可以用行列式来表示:



S=12∣∣∣∣∣xaxbxcyaybyc111∣∣∣∣∣


需要特别注意的是这里

a,b,c 的排列,像图中这样 a,b,c 顺时针排列的,计算出的 S 是负数,需要再取个绝对值。如果 a,b,c 是逆时针排列的,计算出的结果直接就是正的。

面积也可以用矢量的叉积来表示:


S=12∥∥∥ab→×ac→∥∥∥

这里的 ∥⋅∥ 表示求矢量的模。当然也可以不求矢量的模,我们知道矢量叉积是另一个矢量,方向满足右手定则。因此 a,b,c 顺时针排列的,计算出的 S 是负方向的,a,b,c

当 a 点的坐标为 (0,0) 时,上面的两个式子都可以简化为:


S=12∣∣∣xbxcybyc∣∣∣=12∥xbyc−xcyb∥

当三角形的三个顶点都不在原点时,我们也可以借助原点来计算。

给出不规则五边形的逆时针点画出图形python 不规则五边形求面积_叉积_02


从上图中我们可以看出。

Sabc=Soab−Socb−Soac

用行列式表示的话可以写为:


Sabc=12∣∣∣xaxbyayb∣∣∣−12∣∣∣xcxbycyb∣∣∣−12∣∣∣xaxcyayc∣∣∣=12∣∣∣xaxbyayb∣∣∣+12∣∣∣xbxcybyc∣∣∣+12∣∣∣xcxaycya∣∣∣

或者用矢量的叉积来写:



Sabc=12∥∥∥oa→×ob→∥∥∥−12∥∥∥oc→×ob→∥∥∥−12∥∥oa→×oc→∥∥=12∥∥∥oa→×ob→+ob→×oc→+oc→×oa→∥∥∥

无论是用行列式来表示还是矢量叉积表示,式子都变得非常规矩,很容易用程序代码实现。

多边形区域的面积计算和这个计算的思想是一样的。每个线段与坐标原点都能围成一个三角形,这些三角形的“面积”之和就是多边形区域的面积。这里的面积打了引号,因为这些三角形的顶点排列顺序不同时,算出的面积可以是负值。

设多边形的各个顶点按逆时针排列分别是 v1,v2,⋯vn。顶点坐标依次是 (x1,y1),(x2,y2),⋯(xn,yn),那么面积可以写为:



S=12(∣∣∣x1x2y1y2∣∣∣+∣∣∣x2x3y2y3∣∣∣+⋯+∣∣∣xn−1xnyn−1yn∣∣∣+∣∣∣xnx1yny1∣∣∣)

如果顶点的顺序是顺时针的,那么这么求出的面积就是负的,还要再取个负号。

至此,多边形面积计算问题就算解决了。