【计算几何】 叉乘求多边形面积<凹凸均可>

来源:互联网 发布:什么是aso优化 编辑:程序博客网 时间:2024/04/30 08:48

Doctor 要粉刷tardis

    Doctor 在最近一次时空旅行中陷入旋涡,出来的时候发现tardis的外墙上有一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的。他对这个多边形的出现非常不满,所以他要把它用蓝色颜料盖上,现在他需要知道这个多边形的面积。

    多边形被放置在一个X-Y的卡笛尔平面上,它所有的边都平行于两条坐标轴之一。然后按逆时针方向给出各定点的坐标值。所有的坐标值都是整数(因此多边形的面积也为整数)。


INPUT

     第一行输入测试用例个数C(1<=C<=50)。各测试用例第一行给出多边形的顶点数n(n<=100)。接下来的几行每行给出多边形一个顶点的坐标值X和Y(都为整数并且用空格隔开)。顶点按逆时针方向逐个给出。并且多边形的每一个顶点的坐标值-200<=x,y<=200。多边形最后是靠从最后一个顶点到第一个顶点画一条边来封闭的。


OUTPUT

    input                                 output

    1                                           9

    10

     0 0

     4 0

     4 1

     3 1

     3 3

     2 3

     2 2

     1 2

     1 3

     0 3


题意:题意已经很明确,就是求解一个规则的多边形的面积。

思路:求多边形的面积可以使用叉乘求面积。设多边形有n个顶点,用数组将其存起来,其余各点均与第一个点连起来,这样从逆时针方向来看,每两个点构成一个三角形,在使用叉乘来求的面积。有一点要明确的是,每一次使用叉乘求面积,不能加绝对值,因为每一步叉乘求面积求得的是有向面积,将所有的有向面积加和所求的就是该多边形的面积,这种方法不仅适用于凸多边形,同时也适用于凹多边形。


#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;int main(){    int c;    cin>>c;    while(c--)    {        double cx,area=0;        long long a[105],b[105],x1,x2,y1,y2;        int n;        cin>>n;        for(int i=0;i<n;i++)            cin>>a[i]>>b[i];        int i=1;        while(i<n-1)        {            x1=a[i]-a[0],y1=b[i]-b[0];            x2=a[i+1]-a[0],y2=b[i+1]-b[0];            i++;            cx=x1*y2-x2*y1;            //cout<<cx/2<<" ";            area=area+cx/2;        }        cout<<area<<endl;    }    return 0;}


0 0
原创粉丝点击