GIS算法:利用鞋带定理(Shoelace formula)求2D多边形面积

1,实例,运用鞋带定理计算多边形面积

笔者在最近的学习中遇到了计算多边形面积这个问题,其中有个鞋带公式比较有趣,于是搜集了一些资料,整理如下:
GIS算法:利用鞋带定理(Shoelace formula)求2D多边形面积_第1张图片
首先参考一个例子,展示如何利用鞋带定理计算多边形面积。我们只需选择一个顶点,然后按照逆时针顺序读取坐标,最后回到起点。并按照类似系鞋带的顺序将坐标串联起来。
GIS算法:利用鞋带定理(Shoelace formula)求2D多边形面积_第2张图片
对于绿色的线链接的坐标直接相乘。红色的相乘;最后把两者相减。重复操作,最后将计算好的数累和得到4+2+30+24+22+28=110,则多边形的面积为110/2=55
GIS算法:利用鞋带定理(Shoelace formula)求2D多边形面积_第3张图片

2,原理

我们在上一节用到的是鞋带定理,这个公式适合于任何xy平面的闭合曲线,下面我们将介绍该定理的原理。
三角形面积计算公式——叉乘

对于一个三角形,我们可以将其转换为求平行四边形面积的一半
GIS算法:利用鞋带定理(Shoelace formula)求2D多边形面积_第4张图片
取三角形的坐标,a、b和c、d构建两个矩形。两个绿色的直角三角形是大矩形的两个空白,补上了平行四边形和小矩形部分。易知大矩形的面积等于平行四边形加小矩形(小矩形与平行四边形有重叠部分)
GIS算法:利用鞋带定理(Shoelace formula)求2D多边形面积_第5张图片
GIS算法:利用鞋带定理(Shoelace formula)求2D多边形面积_第6张图片
则我们可以通过三角形的坐标求其面积=1/2*(ad-bc)
GIS算法:利用鞋带定理(Shoelace formula)求2D多边形面积_第7张图片

GIS算法:利用鞋带定理(Shoelace formula)求2D多边形面积_第8张图片
那么上个例子的多边形就可以拆分成多个三角形,对各组坐标的叉乘最终计算得出了三角形的面积,累加起来就得到了多边形的面积。
GIS算法:利用鞋带定理(Shoelace formula)求2D多边形面积_第9张图片
对于叉乘我们知道OAOB1=-0B1OA=-0A*OB2;B1在A的左侧(A逆时针方向)叉乘为正数,B2在A右侧(A顺时针方向)则叉乘为负数
GIS算法:利用鞋带定理(Shoelace formula)求2D多边形面积_第10张图片
如图多边形,原点p在多边形外面,使用鞋带定理计算面积。可以发现从V1开始逆时针遍历顶点。如果线段pv1是划向逆时针方向,三角形就是正数,划向顺时针方向为负数。正负抵消最终得到多边形面积
GIS算法:利用鞋带定理(Shoelace formula)求2D多边形面积_第11张图片

3,如何用代码实现求解
我们可以利用下式计算多边形面积。首先把多边形顶点坐标按逆时针顺序存入数组,循环读取数组,带入公式即可。
GIS算法:利用鞋带定理(Shoelace formula)求2D多边形面积_第12张图片

	//数据存储结构,定义一个结构体,存储坐标。初始化结构体数组即可
	struct area
	{
     
		double x;
		double y;
	}
	//实现公式,循环读取坐标,进行叉乘;最后一次是读取最后一个坐标和第一个坐标叉乘,代表回到了原点。
   for(int i = 0; i < 7; i++)
            {
     
                if (i != 6)
                    s += area[i].x * area[i + 1].y - area[i].y * area[i + 1].x;
                else
                    s += area[i].x * area[0].y - area[i].y * area[0].x;
            }

你可能感兴趣的:(GIS算法,gis)