小X的多边形

链接: https://www.nowcoder.com/acm/contest/127/C
来源:牛客网

题目描述

众所周知的是,小X特别喜欢由线条组成的形状,比如说凸多边形,这一天小X正在纸上画着喜欢的凸多边形,这时候小Y走了过来,指着一张图片上的多边形,问小X知道这个图形的面积么,这可把小X难住了,聪明的你一定能够帮助小X解决这个问题,对吧~

输入描述:

多边形上最多有六个点,顺时针or逆时针给定每个点坐标(两个整数表示),保证无多余的点并且没有点重复。

输出描述:

输出一个整数,表示凸多边形的面积,结果四舍五入。
示例1

输入

复制
3
0 0
1 0
2 2

输出

复制
1
示例2

输入

复制
5
-4 -2
1 -3
3 2
-1 4
-4 2

输出

复制
35

转载别人博客的总结:

由于给出的点是相对于我们的坐标原点的坐标,每个点实际上我们可以当作一个顶点相对于原点的向量,如下图所示:
图片
P(0,0)对应的顶点向量分别为:A(x0,y0),B(x1,y1),…,G(x6,y6)
另外,PAB

的矢量面积即为

S⃗ PAB=12PAPB=12(XaYbXbYa)

且多边形面积为:

S=k=1nS⃗ PXY=12k=0n(XkYk+1Xk+1Yk)

根据上述公式可以直接求出多边形的代码从而避免了边长的复杂计算。



#include <iostream>
#include <cstdio>
#include <cmath> 
using namespace std;
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        double x,y,x0,y0,x1,y1,sum = 0.0;
        scanf("%lf%lf",&x,&y);
        x0 = x;
        y0 = y;
        while (n--) {
            scanf("%lf%lf",&x1,&x2);
            sum += (x*y1-y*x1);
            x = x1;
            y = y1;
        }
        sum += (x*y0-y*x0);
        printf("%d\n",int(abs(sum)/2+0.5));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/PeopleOfVision/article/details/80547656