Antinomy与爆炸

链接:https://ac.nowcoder.com/acm/problem/230728
来源:牛客网

题目描述

橘猫忍要爆炸了!!!!!!!!!!!!!!!!
你必须立刻前往Antinomy提供的安全区进行躲避!!!!!!!!!!!!!
橘猫忍一共爆炸 \mathit tt 次,且每次都是在二维平面的原点处呈圆形爆炸,每次圆形爆炸的伤害半径 \mathit rr都不同。
在每一次爆炸里,都有一个矩形安全区,安全区可以规避你在圆形爆炸之外的冲击波的伤害,但无法规避在圆形爆炸内的伤害。
Pi想知道每次爆炸的时候,安全区里不安全的面积是多少。
抽象一点来说,对于每一次爆炸,你都需要计算圆形和矩形的重叠面积。
数据范围:

这样我们大致可以分类,然后把计算模块化
分类标准:几个点在园内,写一个judge函数来判断

这种情况易于计算

以该情况为标准,写计算重叠面积的函数

延长另外两条边,均可以找到和上一种情况类似的点,然后面积相减

代码

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef pair<double,double>PII;
bool judge(PII a,double r)
{
if(a.fi*a.fi+a.se*a.se>r*r) //注意这里判断时我们把在园上的点也算入圆上
{
return false;
}else
{
return true;
}
}
double s(PII a,PII b,PII c,double r)
{
double x=(a.fi*c.fi+a.se*c.se)/(r*r); //向量积/(模*模)
double angel=acos(x);
double s=1/2.0*angel*r*r;
double s1=(a.se-b. se)*b.fi/2.0;
double s2=(c.fi-b.fi)*b.se/2.0;
return s-s1-s2;
}
double cal(double y,double r)
{
return sqrt(r*r-y*y); //模块化计算每个点在圆上的另外一个坐标
如代入x计算y,带入y计算出x
}
signed main()
{
int t;
cin>>t;
while(t--)
{
double x1,x2,y1,y2,r;
cin>>x1>>y1>>x2>>y2>>r;
PII a={x1,y2},b={x1,y1},c={x2,y1},d={x2,y2};
if(!judge(b,r))
{
cout<<0<<'\n';
}else if(judge(d,r))
{
printf("%.4f\n",(y2-y1)*(x2-x1));
}else
{
if(judge(b,r)&&!judge(a,r)&&!(judge(c,r))&&!judge(d,r))
{
PII zs={x1,cal(x1,r)},yx={cal(y1,r),y1};
double result=s(zs,b,yx,r);
printf("%.4f\n",result);
}else if(judge(b,r)&&judge(a,r)&&!(judge(c,r))&&!judge(d,r))
{
PII zs={x1,cal(x1,r)},yx={(cal(y1,r)),y1};
double res1=s(zs,b,yx,r);
PII ex={cal(y2,r),y2};
double res2=s(zs,a,ex,r);
printf("%.4f\n",res1-res2);
}else if(judge(b,r)&&!judge(a,r)&&(judge(c,r))&&!judge(d,r))
{
PII zs={x1,cal(x1,r)},yx={(cal(y1,r)),y1};
double res1=s(zs,b,yx,r);
PII ex={x2,cal(x2,r)};
double res2=s(ex,c,yx,r);
printf("%.4f\n",res1-res2);
}else if(judge(b,r)&&judge(a,r)&&(judge(c,r))&&!judge(d,r))
{
PII yx={x2,cal(x2,r)},zs={cal(y2,r),y2};
double s1=s(zs,{cal(y2,r),cal(x2,r)},yx,r);
double s2=(y2-cal(x2,r))*(x2-cal(y2,r));
double res=s2-s1;
double res2=(x2-x1)*(y2-y1);
double res3=res2-res;
printf("%.4f\n",res3);
}
}
}
}

本文作者:TimMCBen

本文链接:https://www.cnblogs.com/TimMCBen/p/16040185.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   TimMCBen  阅读(35)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.