codevs1249 多边形面积 解题报告

题目描述 Description

给出一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的。要求计算多边形的面积。

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

输入描述 Input Description

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

输出描述 Output Description

输出文件仅有一行包含一个整数,表示多边形的面积。

样例输入 Sample Input

10

0 0

4 0

4 1

3 1

3 3

2 3

2 2

1 2

1 3

0 3

样例输出 Sample Output

9

思路

经典模板题

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
const double eps=1e-10;
int n,p;
struct Point 
{
    double x, y;
    double len() {return sqrt(x * x + y * y);}
    Point(double _=.0,double __=.0):x(_),y(__) {}  
};
Point operator +(const Point &r,const Point &s) 
{return Point(r.x+s.x,r.y+s.y);}
Point operator -(const Point &r,const Point &s) 
{return Point(r.x-s.x,r.y-s.y);}
Point operator *(const Point &r,double s) 
{return Point(r.x*s,r.y*s);}
Point operator /(const Point &r,double s) 
{return Point(r.x/s,r.y/s);}
//点 
vector <Point> poly;
int sign(double a)
{return (a>eps)?1:(a<-eps)?-1:0;}//判断正负 
double dot(const Point &r, const Point &s) 
{return r.x*s.x+r.y*s.y;}//点积 
double cross(const Point &r, const Point &s) 
{return r.x*s.y-r.y*s.x;}//叉积
double area(const vector<Point> &poly) 
{
    double rt=0.0;
    int n=(int)poly.size();
    for (int i=0;i<n;i++) 
    rt+=cross(poly[i],poly[(i+1)%n]);
    return fabs(rt/2.0);
}//多边形的面积 
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        double x,y;
        scanf("%lf%lf",&x,&y);
        poly.push_back(Point(x,y));
    }
    printf("%.0lf\n",area(poly));
    return 0;
} 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值