题目地址:http://acm.timus.ru/problem.aspx?space=1&num=1084
其实就是求圆与正方形相交的面积。圆心在正方形的中心。
分三种情况。
(1)正方形完全包含圆
(2)圆完全包含正方形
(3)圆与正方形相交,见下图。
在三角形OAF中很容易由正弦定理求出角AOF的大小,从而求出角EOF的大小
那么扇形OEF的面积也就出来了 1/2*(角EOF)*r*r.
三角形OFD的面积也可以很容易求出来。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
const double pi = acos(-1.0);
int main()
{
double a,r;
while(scanf("%lf %lf",&a,&r)!=EOF)
{
if(2*r<=a) //正方形包含圆
{
printf("%.3f\n",pi*r*r);
continue;
}
if(a*a<=2*r*r) //圆包含正方形
{
printf("%.3f\n",a*a);
continue;
}
//正方形与圆相交
double sum=0;
double m = sqrt(r*r-a*a/4);
double b = 2*asin((0.5*a-m)*(0.5*a/r)/sqrt(a*a/2));
sum+=0.5*b*r*r*4;
sum+=0.5*a/2*2*m*4;
printf("%.3f\n",sum);
}
return 0;
}