计算几何 - Icebergs - Gym 102501F

计算几何 - Icebergs - Gym 102501F

题意:

给 定 n 个 不 重 叠 的 多 边 形 , 每 个 多 边 形 给 定 m i 个 点 的 坐 标 , 给定n个不重叠的多边形,每个多边形给定m_i个点的坐标, nmi

计 算 出 n 个 多 边 形 的 面 积 之 和 。 计算出n个多边形的面积之和。 n

Examples
Input

1
4
0 0
1 0
1 1
0 1

Output

1

Input

2
5
98 35
79 90
21 90
2 36
50 0
3
0 0
20 0
0 20

Output

6100

数据范围:

1 ≤ N ≤ 1000 , 3 ≤ P ≤ 50 , 0 ≤ x , y ≤ 1 0 6 1≤N≤1000,3≤P≤50,0≤x,y≤10^6 1N10003P500x,y106


注意点:

模 板 函 数 是 求 的 是 有 向 面 积 , 绝 对 值 应 当 在 最 后 返 回 的 时 候 取 , 无 论 是 求 凹 多 边 形 和 凸 多 边 形 。 模板函数是求的是有向面积,绝对值应当在最后返回的时候取,无论是求凹多边形和凸多边形。

且 需 要 保 证 点 的 顺 序 是 按 照 逆 时 针 / 顺 时 针 给 出 的 , 否 则 无 法 唯 一 确 定 一 个 多 边 形 。 且需要保证点的顺序是按照逆时针/顺时针给出的,否则无法唯一确定一个多边形。 /

最 后 输 出 四 舍 五 入 , 应 该 先 用 d o u b l e 类 型 求 和 , 最 后 再 强 转 为 l o n g   l o n g , 最后输出四舍五入,应该先用double类型求和,最后再强转为long\ long, doublelong long

若 直 接 用 l o n g   l o n g 型 进 行 求 和 , 每 加 一 次 都 可 能 会 损 失 一 次 精 度 。 若直接用long\ long型进行求和,每加一次都可能会损失一次精度。 long long

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<vector>
#include<algorithm>

#define ll long long

using namespace std;

const double eps=1e-10;
const double pi=acos(-1.0);

struct Point 
{
    double x,y;
    Point(double x=0,double y=0) : x(x), y(y) {}
};

//点与向量
typedef Point Vector;

Vector operator + (Vector A,Vector B) { return Vector(A.x+B.x,A.y+B.y); }

Vector operator - (Point A,Point B) { return Vector(A.x-B.x,A.y-B.y); }

Vector operator * (Vector A,double p) { return Vector(A.x*p,A.y*p); }

Vector operator / (Vector A,double p) { return Vector(A.x/p,A.y/p); }

double Cross(Vector A, Vector B) { return A.x*B.y - A.y*B.x; }  //若A到B逆时针则为正,否则为负

double PolygonArea(Point p[], int n) //多边形的有向面积
{
    double area=0;
    for(int i=1;i<n-1;i++) area+=Cross(p[i]-p[0],p[i+1]-p[0]);
    return fabs(area/2);
}

Point V[1010][60];

int main()
{
    int m,n;
    scanf("%d",&m);
    double area=0;
    for(int i=0;i<m;i++)
    {
        scanf("%d",&n);
        for(int j=0;j<n;j++) scanf("%lf%lf",&V[i][j].x,&V[i][j].y);
        area+=PolygonArea(V[i],n);
    }
    printf("%lld\n",(ll)area);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值