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的部分内容会重写再搬迁到公众号,欢迎关注!