投影到地面之后,会发现圆形在平行光下面积和形状是不会变的,也就是所要求的图形是若干个圆和把相邻两个圆连起来的公切线所组成的。

公切线和圆间距瞎求一下就行,注意要去掉被完全覆盖的圆

然后simpson即可

eps大概1e-6

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=1005;
const double eps=1e-6,inf=1e15;
double alp;
int n,m,num;
struct dian
{
double x,y;
dian (double X=0,double Y=0)
{
x=X; y=Y;
}
};
struct yuan
{
double r;
dian c;
yuan(dian a=(dian){0,0},double R=0)
{
c=a; r=R;
}
}a[N];
struct xian
{
dian s,t;
double k,b;
xian(dian S=(dian){0,0},dian T=(dian){0,0})
{
s=S,t=T;
if(s.x>t.x) swap(s,t);
k=(s.y-t.y)/(s.x-t.x);
b=s.y-k*s.x;
}
double f(double x)
{
return k*x+b;
}
}l[N];
int cmp(double x)
{
if(fabs(x)<eps)
return 0;
return x<0? -1:1;
}
double f(double x)
{
double re=0;
for(int i=1;i<=n;i++)
{
double d=fabs(x-a[i].c.x);
if(cmp(d-a[i].r)>0)
continue;
double len=2*sqrt(a[i].r*a[i].r-d*d);
re=max(re,len);
}
for(int i=1;i<=num;i++)
if(x>=l[i].s.x && x<=l[i].t.x)
re=max(re,2*l[i].f(x));
return re;
}
double sps(double l,double r,double now,double fl,double fr,double fm)
{//cout<<l<<" "<<r<<endl;
double mid=(l+r)/2,ffl=f((l+mid)/2),ffr=f((mid+r)/2),p=(fl+fm+ffl*4)*(mid-l)/6,q=(fm+fr+ffr*4)*(r-mid)/6;
if(cmp(now-p-q)==0)
return now;
else
return sps(l,mid,p,fl,fm,ffl)+sps(mid,r,q,fm,fr,ffr);
}
int main()
{
scanf("%d%lf",&n,&alp);
double h,r;
for(int i=1;i<=n+1;i++)
{
scanf("%lf",&h),
a[i]=(yuan){((dian){(h/tan(alp))+a[i-1].c.x,0}),0};
}
for(int i=1;i<=n;i++)
scanf("%lf",&r),a[i].r=r;
double L=inf,R=-inf;
for(int i=1;i<=n+1;i++)
L=min(L,a[i].c.x-a[i].r),R=max(R,a[i].c.x+a[i].r);
for(int i=1;i<=n;i++)
{
double d=a[i+1].c.x-a[i].c.x;
if(cmp(d-fabs(a[i].r-a[i+1].r))<0) continue;
double sina=(a[i].r-a[i+1].r)/d,cosa=sqrt(1-sina*sina);
l[++num]=(xian){(dian){a[i].c.x+a[i].r*sina,a[i].r*cosa},(dian){a[i+1].c.x+a[i+1].r*sina,a[i+1].r*cosa}};
}
// printf("%.2lf\n",Simpson(L,R,Calc(L,R)));
double fl=f(L),fr=f(R),fm=f((L+R)/2);
printf("%.2lf\n",sps(L,R,(fl+4*fm+fr)*(R-L)/6,fl,fr,fm));
return 0;
}
/*
2 0.72953
9.61090 0.26021 4.47090
2.98979 2.00036
*/

最新文章

  1. php提供更快的文件下载
  2. 华硕笔记本之secure boot
  3. hdu 2041:超级楼梯(水题,递归)
  4. 让未激活的win8.1不再跳出提示激活的窗口
  5. filesort是什么意思?
  6. 2.5.5 使用DatePickerDialog, TimePickerDialog
  7. Windows7添加SSD硬盘后重启卡住正在启动
  8. WAMP 环境下,YII创建失败 提示 &quot;&#39;php.exe&#39; 不是内部或外部命...&quot;
  9. Spring中多个工程停多个资源文件ignoreUnresolvablePlaceholders配置
  10. 使用 SVG 和 JS 创建一个由星形变心形的动画
  11. Oracle单机Rman笔记[2]---RMAN基础介绍
  12. 一起学习造轮子(三):从零开始写一个React-Redux
  13. UVA1451 Average
  14. 用C# 7.0的switch...case模式匹配取代一堆if语句
  15. ICS 组件 for lazarus 1.0.12
  16. 序列化 NSKeyedArchiver,NSPropertyListSerialization
  17. ARM_Instruction_Set_Encoding_hacking(ARM指令集编码格式解读)
  18. VMware vCenter Server 6.5.0 U1g
  19. Jfinal框架登陆页面的图形验证码
  20. 介绍在JSP中如何使用JavaBeans?

热门文章

  1. Java线程的5种状态及切换(透彻讲解)
  2. python之-微信开发学习
  3. Delphi:解决重绘造成的窗体闪烁问题
  4. 重装JDK后Tomcat和Eclipse的配置
  5. Spring MVC 异步处理请求,提高程序性能
  6. javascript 自定义错误处理
  7. poj 1426 Find The Multiple ( BFS+同余模定理)
  8. 【转】LoadRunner监控 -- Linux的17个指标
  9. Receiver type ‘X’ for instance message is a forward declaration
  10. 使用spring框架时,使用xml还是注解