求任意多边形的面积&HDU-2036 改革春风吹满地

求任意多边形的面积

给定多边形的顶点坐标(有序),让你来求这个多边形的面积,你会怎么做?
我们知道,任意多边形都可以分割为N个三角形,所以,如果以这为突破点,那么我们第一步就是把给定的多边形,分割为数个三角形,分别求面积,最后累加就可以了,把多边形分割为三角形的方式多种多样,在这里,我们按照如下图的方法分割:

这里写图片描述

S点作为起始点(点1),a->e依次作为点2,3……。
一个三角形的面积是怎样的呢?
根据线性代数的知识,我们有如下的三角形面积公式,称之为有向面积(signed area):

这里写图片描述

将这个行列式以第三列展开可以得到:

这里写图片描述

这就是以点1、2、3构成的三角形的有向面积(点如果是顺时针给出,有向面积为负,逆时针给出,有向面积为正),那么继续我们的工作,通过三角形的面积公式,来得到多边形的面积公式:
对于图1而言,多边形的面积就是:
S(1->6)=S(1,2,3)+S(1,3,4)+S(1,4,5)+S(1,5,6)
这里我们不免有些疑问,第一,图1所给出的是凸多边形,那这种算法对于非凸多边形是否同样适用呢?比如下面这个最简单的凸多边形的图形:

这里写图片描述

我们之前提到的公式时求有向面积,因此这里也是满足的。请注意从图中看,Sab点为顺时针排列,Sbc点为逆时针排列,面积从数值上就是从Sab这个超过范围的大三角形中去掉Sbc这个小三角形,最后的结果神奇的就是多边形Sabc的面积,那么这个结论能否推广到任意多边形呢?

这里写图片描述

在这里不做证明,下面给出的公式,就是任意多边形的面积公式:

这里写图片描述

这里写图片描述

例题

改革春风吹满地

Problem Description
“ 改革春风吹满地,
不会AC没关系;
实在不行回老家,
还有一亩三分地。
谢谢!(乐队奏乐)”
话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云里雾里,而且,还竟然来这么几句打油诗。
好呀,老师的责任就是帮你解决问题,既然想种田,那就分你一块。
这块田位于浙江省温州市苍南县灵溪镇林家铺子村,多边形形状的一块地,原本是linle 的,现在就准备送给你了。不过,任何事情都没有那么简单,你必须首先告诉我这块地到底有多少面积,如果回答正确才能真正得到这块地。
发愁了吧?就是要让你知道,种地也是需要AC知识的!以后还是好好练吧…
Input
输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2… xn, yn),为了简化问题,这里的所有坐标都用整数表示。
输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。
Output
对于每个测试实例,请输出对应的多边形面积,结果精确到小数点后一位小数。
每个实例的输出占一行。
Sample Input
3 0 0 1 0 0 1
4 1 0 0 1 -1 0 0 -1
0
Sample Output
0.5
2.0

#include <stdio.h>
#include <math.h>
int main()
{
    int n;
    while ((scanf("%d",&n))!=EOF)
    {
        if(n==0)break;
        int a[105],b[105];
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&a[i],&b[i]);  
        }
        double S[105],sum=0;
        for(int i=1;i<=n-2;i++)
        {
            S[i]=((a[i]-a[0])*(b[i+1]-b[0])-(b[i]-b[0])*(a[i+1]-a[0]))/2.0;
            sum+=S[i];
        }
        printf("%.1f\n",sum);
    }
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值