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

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

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

2,原理

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

对于一个三角形,我们可以将其转换为求平行四边形面积的一半
在这里插入图片描述
取三角形的坐标,a、b和c、d构建两个矩形。两个绿色的直角三角形是大矩形的两个空白,补上了平行四边形和小矩形部分。易知大矩形的面积等于平行四边形加小矩形(小矩形与平行四边形有重叠部分)
在这里插入图片描述
在这里插入图片描述
则我们可以通过三角形的坐标求其面积=1/2*(ad-bc)
在这里插入图片描述

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

3,如何用代码实现求解
我们可以利用下式计算多边形面积。首先把多边形顶点坐标按逆时针顺序存入数组,循环读取数组,带入公式即可。
在这里插入图片描述

	//数据存储结构,定义一个结构体,存储坐标。初始化结构体数组即可
	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;
            }

新开通了本人的公众号,欢迎关注:燕南路GISer ,专注GIS干货分享,不定期更新。
主要兴趣:GIS、时空数据挖掘、python、机器学习深度学习
CSDN的部分内容会重写再搬迁到公众号,欢迎关注!
在这里插入图片描述

  • 15
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燕南路GISer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值