多边形和圆的相交面积(模板)hdu2892、hdu4404
area
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 686 Accepted Submission(s): 265
作为一名优秀的飞行员,任务是必须要完成的,当然,凭借小白出色的操作,顺利地将炸弹投到了岛上某个位置,可是长官更关心的是,小白投掷的炸弹到底摧毁了岛上多大的区域?
岛是一个不规则的多边形,而炸弹的爆炸半径为R。
小白只知道自己在(x,y,h)的空间坐标处以(x1,y1,0)的速度水平飞行时投下的炸弹,请你计算出小白所摧毁的岛屿的面积有多大. 重力加速度G = 10.
然后输入两个数代表飞机当前的速度(x1, y1);
接着输入炸弹的爆炸半径R;
再输入一个数n,代表岛屿由n个点组成;
最后输入n行,每行输入一个(x',y')坐标,代表岛屿的顶点(按顺势针或者逆时针给出)。(3<= n < 100000)
100 0
100
4
1900 100
2000 100
2000 -100
1900 -100
- #include"cstdio"
- #include"cstring"
- #include"cstdlib"
- #include"cmath"
- #include"string"
- #include"map"
- #include"cstring"
- #include"algorithm"
- #include"iostream"
- #include"set"
- #include"queue"
- #include"stack"
- #define inf 1000000000000
- #define M 100009
- #define LL long long
- #define eps 1e-12
- #define mod 1000000007
- #define PI acos(-1.0)
- using namespace std;
- struct node
- {
- double x,y;
- node(){}
- node(double xx,double yy)
- {
- x=xx;
- y=yy;
- }
- node operator -(node s)
- {
- return node(x-s.x,y-s.y);
- }
- node operator +(node s)
- {
- return node(x+s.x,y+s.y);
- }
- double operator *(node s)
- {
- return x*s.x+y*s.y;
- }
- double operator ^(node s)
- {
- return x*s.y-y*s.x;
- }
- }p[M];
- double max(double a,double b)
- {
- return a>b?a:b;
- }
- double min(double a,double b)
- {
- return a<b?a:b;
- }
- double len(node a)
- {
- return sqrt(a*a);
- }
- double dis(node a,node b)//两点之间的距离
- {
- return len(b-a);
- }
- double cross(node a,node b,node c)//叉乘
- {
- return (b-a)^(c-a);
- }
- double dot(node a,node b,node c)//点成
- {
- return (b-a)*(c-a);
- }
- int judge(node a,node b,node c)//判断c是否在ab线段上(前提是c在直线ab上)
- {
- if(c.x>=min(a.x,b.x)
- &&c.x<=max(a.x,b.x)
- &&c.y>=min(a.y,b.y)
- &&c.y<=max(a.y,b.y))
- return 1;
- return 0;
- }
- double area(node b,node c,double r)
- {
- node a(0.0,0.0);
- if(dis(b,c)<eps)
- return 0.0;
- double h=fabs(cross(a,b,c))/dis(b,c);
- if(dis(a,b)>r-eps&&dis(a,c)>r-eps)//两个端点都在圆的外面则分为两种情况
- {
- double angle=acos(dot(a,b,c)/dis(a,b)/dis(a,c));
- if(h>r-eps)
- {
- return 0.5*r*r*angle;
- }
- else if(dot(b,a,c)>0&&dot(c,a,b)>0)
- {
- double angle1=2*acos(h/r);
- return 0.5*r*r*fabs(angle-angle1)+0.5*r*r*sin(angle1);
- }
- else
- {
- return 0.5*r*r*angle;
- }
- }
- else if(dis(a,b)<r+eps&&dis(a,c)<r+eps)//两个端点都在圆内的情况
- {
- return 0.5*fabs(cross(a,b,c));
- }
- else//一个端点在圆上一个端点在圆内的情况
- {
- if(dis(a,b)>dis(a,c))//默认b在圆内
- {
- swap(b,c);
- }
- if(fabs(dis(a,b))<eps)//ab距离为0直接返回0
- {
- return 0.0;
- }
- if(dot(b,a,c)<eps)
- {
- double angle1=acos(h/dis(a,b));
- double angle2=acos(h/r)-angle1;
- double angle3=acos(h/dis(a,c))-acos(h/r);
- return 0.5*dis(a,b)*r*sin(angle2)+0.5*r*r*angle3;
- }
- else
- {
- double angle1=acos(h/dis(a,b));
- double angle2=acos(h/r);
- double angle3=acos(h/dis(a,c))-angle2;
- return 0.5*r*dis(a,b)*sin(angle1+angle2)+0.5*r*r*angle3;
- }
- }
- }
- int main()
- {
- double x,y,h,x1,y1,R;
- while(scanf("%lf%lf%lf",&x,&y,&h)!=-1)
- {
- scanf("%lf%lf%lf",&x1,&y1,&R);
- int n;
- scanf("%d",&n);
- for(int i=0;i<n;i++)
- {
- scanf("%lf%lf",&p[i].x,&p[i].y);
- }
- p[n]=p[0];
- double V=sqrt(2*10*h);
- double t0=V/10;
- double x0=x+x1*t0;
- double y0=y+y1*t0;
- node O(x0,y0);
- for(int i=0;i<=n;i++)
- p[i]=p[i]-O;
- O=node(0,0);
- double sum=0;
- for(int i=0;i<n;i++)
- {
- int j=i+1;
- double s=area(p[i],p[j],R);
- if(cross(O,p[i],p[j])>0)
- sum+=s;
- else
- sum-=s;
- }
- printf("%.2lf\n",fabs(sum));
- }
- return 0;
- }
多边形和圆的相交面积(模板)hdu2892、hdu4404的更多相关文章
- 牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板
链接:https://www.nowcoder.com/acm/contest/141/J来源:牛客网 Eddy has graduated from college. Currently, he i ...
- HDU 5130 Signal Interference --计算几何,多边形与圆的交面积
题意: 求所有满足PB <= k*PA 的P所在区域与多边形的交面积. 解法: 2014广州赛区的银牌题,当时竟然没发现是圆,然后就没做出来,然后就gg了. 圆的一般式方程: 设A(x1,y1) ...
- codeforce gym/100495/problem/K—Wolf and sheep 两圆求相交面积 与 gym/100495/problem/E—Simple sequence思路简述
之前几乎没写过什么这种几何的计算题.在众多大佬的博客下终于记起来了当时的公式.嘚赶快补计算几何和概率论的坑了... 这题的要求,在对两圆相交的板子略做修改后,很容易实现.这里直接给出代码.重点的部分有 ...
- hdu5858 Hard problem(求两圆相交面积)
题目传送门 Hard problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- hdu 3264(枚举+二分+圆的公共面积)
Open-air shopping malls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- I - Intersection HDU - 5120(圆环相交面积)
Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The followin ...
- 牛客网暑期ACM多校训练营(第三场)J 多边形与圆相交的面积
链接:https://www.nowcoder.com/acm/contest/141/J 题目描述 Eddy has graduated from college. Currently, he is ...
- poj3675 求多边形与圆的面积交
题意:给出多边形的顶点坐标.圆的圆心坐标和半径,求面积交 sol:又是模板题啦= = 注意poj的C++好像认不出hypot函数,要稍微改写一下. hypot(double x,double y):即 ...
- hdu3060Area2(任意多边形相交面积)
链接 多边形的面积求解是通过选取一个点(通常为原点或者多边形的第一个点)和其它边组成的三角形的有向面积. 对于两个多边形的相交面积就可以通过把多边形分解为三角形,求出三角形的有向面积递加.三角形为凸多 ...
随机推荐
- n0_n1
#include<stdio.h>int a[10];void quanpailie(int i){ if(i==10) {for(i=0;i<10;i++) { print ...
- Python创建list和按照索引访问list
Python创建list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素.比如,列出班里所有同学的名字,就可以用一个list表示:>> ...
- Difference Search Path
1.Framework Search Path where to search frameworks (.framework bundles) in addition to sys ...
- docker-compose bug
annot mount volume over existing file, file exists /var/lib/docker/aufs/mnt/0ac71fed1af802a4ecf4a93b ...
- CDH商业版本的搭建(hadoop+hive+sqoop)
一:准备工作 1.步骤 1)hadoop ->下载解压 ->修改配置文件 ->hadoop-env JAVA_HOME ->core-site fs.defaultFS had ...
- Qt 自定义 滚动条 样式(模仿QQ)
今天是时候把软件中的进度条给美化美化了,最初的想法就是仿照QQ. 先前的进度条是这样,默认的总是很难受欢迎的:美化之后的是这样,怎么样?稍微好看一点点了吧,最后告诉你实现这个简单的效果在Qt只需要加几 ...
- SQL backup&restore
--完整备份Backup Database NorthwindCSTo disk='G:\Backup\NorthwindCS_Full_20070908.bak' --差异备份Backup Data ...
- PHP---关联模型
MANY_TO_MANY
- ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接
原文:ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接 安装ArcSDE for SQL Server,最后一步成功后的界面如下: 在ArcMap中创建ArcSDE ...
- c# 过滤字符串中的重复字符
有字符串"a,s,d,v,a,v",如果想去除其中重复的字符,怎么做? 下面是一个方法,用Hashtable来记录唯一字符,排除重复字符,仅供参考. 1.过滤方法: public ...