方法改进,精度可调2进制关系,由粗到细映射查找没覆盖的点,精度调整测试只有两个结果,时间超时和答案错误,说明不能用划分为小点来加起来近似面积,估计要用函数方法
#include
#include
void jisuan(double s1,double sm,double zhi);
double x[50],y[50],z[50],r[50],g,G,sum=0,kl,km,ZHI=2;//可调
int a,b,n,i;
char flag1=0,flag2=0;
int main()
{
scanf("%d %d %lf %d",&a,&b,&g,&n);
G=cos(g*atan(1)/45)/sin(g*atan(1)/45);
for(i=0;i
{
scanf("%lf %lf %lf %lf",&x[i],&y[i],&z[i],&r[i]);
x[i]=x[i]-z[i]*G;
}
while(a<8*ZHI||b<8*ZHI)//可调
ZHI=ZHI/2;
for(kl=ZHI;kl
{
for(km=ZHI;km
{
flag1=0,flag2=0;
for(i=0;i
{
if((r[i]-sqrt(2)*ZHI)>0)
if(pow((kl-x[i]),2)+pow((km-y[i]),2)
flag1=1;
if(pow((kl-x[i]),2)+pow((km-y[i]),2)
flag2=1;
}
if(flag2==0)
sum=sum+4*ZHI*ZHI;
else if(flag1==0)
{
jisuan(kl,km,ZHI/2);
}
}
}
printf("%.2lf\n",sum);
/*getchar();
getchar();*/
}
void jisuan(double sl,double sm,double zhi)
{
double l=0,m=0;
if(zhi>pow(2,-7))//可调
{
for(l=sl-zhi;l
{
for(m=sm-zhi;m
{
flag1=0,flag2=0;
for(i=0;i
{
if((r[i]-sqrt(2)*zhi)>0)
if(pow((l-x[i]),2)+pow((m-y[i]),2)
flag1=1;
if(pow((l-x[i]),2)+pow((m-y[i]),2)
flag2=1;
}
if(flag2==0)
sum=sum+4*zhi*zhi;
else if(flag1==0)
{
jisuan(l,m,zhi/2);
}
}
}
}
else
{
for(l=sl-zhi;l
{
for(m=sm-zhi;m
{
flag1=0,flag2=0;
for(i=0;i
{
if(pow((l-x[i]),2)+pow((m-y[i]),2)
flag2=1;
}
if(flag2==0)
sum=sum+4*zhi*zhi;
}
}
}
}