area HDU - 2892 计算几何&&多边形与圆的相交面积&&模板

小白最近被空军特招为飞行员,参与一项实战演习。演习的内容是轰炸某个岛屿。。。 
作为一名优秀的飞行员,任务是必须要完成的,当然,凭借小白出色的操作,顺利地将炸弹投到了岛上某个位置,可是长官更关心的是,小白投掷的炸弹到底摧毁了岛上多大的区域? 
岛是一个不规则的多边形,而炸弹的爆炸半径为R。 
小白只知道自己在(x,y,h)的空间坐标处以(x1,y1,0)的速度水平飞行时投下的炸弹,请你计算出小白所摧毁的岛屿的面积有多大. 重力加速度G = 10. 

Input

首先输入三个数代表小白投弹的坐标(x,y,h); 
然后输入两个数代表飞机当前的速度(x1, y1); 
接着输入炸弹的爆炸半径R; 
再输入一个数n,代表岛屿由n个点组成; 
最后输入n行,每行输入一个(x',y')坐标,代表岛屿的顶点(按顺势针或者逆时针给出)。(3<= n < 100000) 

Output

输出一个两位小数,表示实际轰炸到的岛屿的面积。

Sample Input

0 0 2000
100 0
100 

4
1900 100
2000 100
2000 -100
1900 -100

Sample Output

15707.96

题解:初中物理 h=(g*t²)/2 ,x=vt的方程组

计算一下圆心在哪 

然后求圆和多边形的面积交点,套模板

关键不在这。。。我在看代码的时候发现了一个神代码

500多行。。。。当场就跪了

后来仔细一看里面涵盖了大量的模板,基本上计算几何里面能有的这里面都有

当场就开心的哭出了声,这个模板以后可以用到啥 就摘出来啥,反正比赛的时候复制粘贴肯定不可能

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

const double eps = 1e-8;
const double INF = 1e20;
const double pi = acos (-1.0);

int dcmp (double x) {
    if (fabs (x) < eps) return 0;
    return (x < 0 ? -1 : 1);
}
inline double sqr (double x) {return x*x;}

//*************点
struct Point {
    double x, y;
    Point (double _x = 0, double _y = 0):x(_x), y(_y) {}
    void input () {scanf ("%lf%lf", &x, &y);}
    void output () {printf ("%.2f %.2f\n", x, y);}
    bool operator == (const Point &b) const {
        return (dcmp (x-b.x) == 0 && dcmp (y-b.y) == 0);
    }
    bool operator < (const Point &b) const {
        return (dcmp (x-b.x) == 0 ? dcmp (y-b.y) < 0 : x < b.x);
    }
    Point operator + (const Point &b) const {
        return Point (x+b.x, y+b.y);
    }
    Point operator - (const Point &b) const {
        return Point (x-b.x, y-b.y);
    }
    Point operator * (double a) {
        return Point (x*a, y*a);
    }
    Point operator / (double a) {
        return Point (x/a, y/a);
    }
    double len2 () {//返回长度的平方
        return sqr (x) + sqr (y);
    }
    double len () {//返回长度
        return sqrt (len2 ());
    }
    Point change_len (double r) {//转化为长度为r的向量
        double l = len ();
        if (dcmp (l) == 0) return *this;//零向量返回自身
        r /= l;
        return Point (x*r, y*r);
    }
    Point rotate_left () {//顺时针旋转90度
        return Point (-y, x);
    }
    Point rotate_right () {//逆时针旋转90度
        return Point (y, -x);
    }
    Point rotate (Point p, double ang) {//绕点p逆时针旋转ang
        Point v = (*this)-p;
        double c = cos (ang), s = sin (ang);
        return Point (p.x + v.x*c - v.y*s, p.y + v.x*s + v.y*c);
    }
    Point normal () {//单位法向量
        double l = len ();
        return Point (-y/l, x/l);
    }
};

double cross (Point a, Point b) {//叉积
    return a.x*b.y-a.y*b.x;
}
double dot (Point a, Point b) {//点积
    return a.x*b.x + a.y*b.y;
}
double dis (Point a, Point b) {//两个点的距离
    Point p = b-a; return p.len ();
}
double rad_degree (double rad) {//弧度转化为角度
    return rad/pi*180;
}
double rad (Point a, Point b) {//两个向量的夹角
    return fabs (atan2 (fabs (cross (a, b)), dot (a, b)) );
}
bool parallel (Point a, Point b) {//向量平行
    double p = rad (a, b);
    return dcmp (p) == 0 || dcmp (p-pi) == 0;
}

//************直线 线段
struct Line {
    Point s, e;//直线的两个点
    Line () 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值