http://acm.hdu.edu.cn/showproblem.php?pid=2892

解题思路:

求多边形与圆的相交的面积是多少。

以圆心为顶点,将多边形划分为n个三角形。

接下来就求出每个三角形与圆相交的面积。

因为三角形的一个点是圆心,所以三角形的另外两个点与圆的情况有以下几种:

(1)两点都在圆里,三角形与圆相交的面积=三角形的面积。

(2)一个点在圆外,一个点在圆里,三角形与圆相交的面积=小三角形的面积+扇形面积

(3)两点都在圆外,又分为几种情况:

  1、两点构成的线段与圆相交的点数0或1个时,三角形与圆相交的面积=扇形的面积

  2.两点构成的线段与圆相交的点数2个时,三角形与圆相交的面积=大扇形面积+小三角形面积-小扇形的面积

 #include<cmath>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std; #define MAXN 100000+10
#define PI acos(-1.0)
#define EPS 0.00000001 int dcmp(double x){
if(fabs(x) < EPS)
return ;
return x < ? - : ;
} struct Point{
double x, y;
Point(double x = , double y = ): x(x), y(y) {}
}; struct Circle{
Point c;
double r;
Circle(Point c = Point(, ), double r = ): c(c), r(r) {}
}; 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 dot(Vector A, Vector B){
return A.x * B.x + A.y * B.y;
} double length(Vector A){
return sqrt(dot(A, A));
} double angle(Vector A, Vector B){
return acos(dot(A, B) / length(A) / length(B));
} double cross(Vector A, Vector B){
return A.x * B.y - A.y * B.x;
} Circle bomb;//炸弹爆炸的坐标及半径
Point p[MAXN];//岛屿的点
int n;//岛屿点数 double point_line_distance(Point P, Point A, Point B){//点到直线的距离
Vector AP = P - A, AB = B - A;
return fabs(cross(AP, AB) / length(AB));
} Point point_line_projection(Point P, Point A, Point B){//点在直线上的映射
Vector v = B - A;
return A + v * (dot(v, P - A) / dot(v, v));
} int circle_line_intersect(Circle C, Point A, Point B, vector<Point> &v){
double dist = point_line_distance(C.c, A, B);
int d = dcmp(dist - C.r);
if(d > ){
return ;
}
Point pro = point_line_projection(C.c, A, B);
if(d == ){
v.push_back(pro);
return ;
}
double len = sqrt(C.r * C.r - dist * dist);//勾股定理
Vector AB = B - A;
Vector l = AB / length(AB) * len;
v.push_back(pro + l);
v.push_back(pro - l);
return ;
} bool point_on_segment(Point P, Point A, Point B){//判断点在线段上
Vector PA = A - P, PB = B - P;
return dcmp(cross(PA, PB)) == && dcmp(dot(PA, PB)) <= ;
} double circle_delta_intersect_area(Circle C, Point A, Point B){
Vector CA = A - C.c, CB = B - C.c;
double da = length(CA), db = length(CB); da = dcmp(da - C.r), db = dcmp(db - C.r); if(da <= && db <= ){//三角形在圆里面
return fabs(cross(CA, CB)) * 0.5;
} vector<Point> v;
int num = circle_line_intersect(C, A, B, v);//圆和直线的关系
double carea = C.r * C.r * PI;
Point t;
if(da <= && db > ){//左边的点在圆里 右边的点在圆外
t = point_on_segment(v[], A, B) ? v[] : v[]; double area = fabs(cross(CA, t - C.c)) * 0.5, an = angle(CB, t - C.c);
return area + carea * an / PI / ;
}
if(da > && db <= ){//左边点在圆外 右边点在圆里
t = point_on_segment(v[], A, B) ? v[] : v[]; double area = fabs(cross(CB, t - C.c)) * 0.5, an = angle(CA, t - C.c);
return area + carea * an / PI / ;
}
//两个点都在圆外
if(num == ){
double bigarea = carea * angle(CA, CB) / PI / ,
smallarea = carea * angle(v[] - C.c, v[] - C.c) / PI / ,
deltaarea = fabs(cross(v[] - C.c, v[] - C.c)) * 0.5;
return bigarea + deltaarea - smallarea;
}
return carea * angle(CA, CB) / PI / ;//两点都在圆外 直线AB与圆交点1个或两个
} double circle_polygon_intersect_area(){//源于多边形相交面积
p[n] = p[];
double ans = ;
for(int i = ; i < n; i++ ){
double area = circle_delta_intersect_area( bomb, p[i], p[i + ] );
if(cross(p[i] - bomb.c, p[i + ] - bomb.c) < ){
area = -area;
}
ans += area;
}
return ans > ? ans : -ans;
} void solve(){
scanf("%d", &n );
for(int i = ; i < n; i++ ){
scanf("%lf%lf", &p[i].x, &p[i].y );
}
printf("%.2lf\n", circle_polygon_intersect_area() );
} int main(){
//freopen("data.in", "r", stdin );
double x, y, h, x1, y1, r;
while(~scanf("%lf%lf%lf", &x, &y, &h )){
scanf("%lf%lf%lf", &x1, &y1, &r ); double t = sqrt(0.2 * h);//h = 0.5 * G * t^2 重力加速度公式 bomb = Circle( Point(x1 * t + x, y1 * t + y), r ); solve();
}
return ;
}

hdu 2892 Area的更多相关文章

  1. hdu 2892 area (圆与多边形交面积)

    Problem - 2892 这道题的做法是以圆心为原点,对多边形进行三角剖分.题目描述中,多边形的可能是顺时针或者是逆时针给出,不过在我的做法里,是用有向面积来计算的,和常见的多边形面积的求法类似, ...

  2. HDU - 2892:area (圆与多边形交 求面积)

    pro:飞行员去轰炸一个小岛,给出炸弹落地点的位置信息,以及轰炸半径:按顺时针或者逆时针给出小岛的边界点. 求被轰炸的小岛面积. sol:即是求圆和多边形的面积交. (只会套板子的我改头换面,先理解然 ...

  3. hdu 2528 Area

    2014-07-30 http://acm.hdu.edu.cn/showproblem.php?pid=2528解题思路: 求多边形被一条直线分成两部分的面积分别是多少.因为题目给的直线一定能把多边 ...

  4. hdu 4946 Area of Mushroom(凸包)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 Area of Mushroom Time Limit: 2000/1000 MS (Java/Ot ...

  5. HDU 4946 Area of Mushroom(构造凸包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 题目大意:在一个平面上有n个点p1,p2,p3,p4....pn,每个点可以以v的速度在平面上移 ...

  6. HDU 4946 Area of Mushroom 凸包

    链接:pid=4946">http://acm.hdu.edu.cn/showproblem.php?pid=4946 题意:有n个人.在位置(xi,yi),速度是vi,假设对于某个点 ...

  7. HDU 4946 Area of Mushroom 凸包 第八次多校

    题目链接:hdu 4946 题意:一大神有N个学生,各个都是小神,大神有个二次元空间,每一个小神都有一个初始坐标,如今大神把这些空间分给徒弟们,规则是假设这个地方有一个人比谁都先到这,那么这个地方就是 ...

  8. hdu 2528:Area(计算几何,求线段与直线交点 + 求多边形面积)

    Area Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. hdu 1451 Area in Triangle(计算几何 三角形)

    Given a triangle field and a rope of a certain length (Figure-1), you are required to use the rope t ...

随机推荐

  1. DDL DML DCL SQL

    https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_ddl SQL The Structured Query Language tha ...

  2. delphi 创建DBASE和FOXPRO两类DBF数据文件的差异

    delphi 创建DBASE和FOXPRO两类DBF数据文件的差异,主要有几点: 1.创建方法不同 DBASE的创建方法: Self.Table1.Close; Self.Table1.Active ...

  3. Summary of java stream classes

    Java’s stream classes are good for streaming sequences of bytes, but they’re not good for streaming ...

  4. A2DP协议笔记

    1.概述     A2DP(Advanced Audio Distribution Profile)是蓝牙的音频传输协议,典型应用为蓝牙耳机.A2DP协议的音频数据在ACL Link上传输,这与SCO ...

  5. sqlserver 简单的事物用法

    SELECT * FROM Interface_UserPort BEGIN TRY BEGIN TRAN Tran_2012_12_25 ,) --raiserror 50005N'抛出错误' CO ...

  6. Qt Focus事件,FocusInEvent()与FocusOutEvent()

    描述:一开始我要实现的目的就是,在一个窗体上有多个可编辑控件(比如QLineEdit.QTextEdit等),当哪个控件获得焦点,哪个控件的背景就高亮用来起提示作用,查了下文档应该用focusInEv ...

  7. 使用C#发送正文带图片邮件

    最近有个地方用到正文带图片的邮件发送功能,由于发送邮件调用的是web service,要求正文必须是string,而接收方要能看到图片,还不能单纯的添加一个图片地址链接,查阅了很多资料,基本上都是从头 ...

  8. 用javascript实现用户登录验证

    <script language=javascript> function checkSubmit() { if ((document.form1.name.value)=="& ...

  9. 【转】Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用

    Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用 分类: Android UI2015-06-15 16: ...

  10. ul和ol的一些知识

    ul和ol的一些知识 div#div0 ul{ border:1px solid #ccc; list-style:none; } div#div0 ul li{ border:1px solid g ...