题解:如果绳子足够长,那么直接输出三角形的面积,如果绳子不够三角形的内接圆,那么输出绳子构成的圆的面积,如果绳子正好处于两者之间呢?使用物理上的“撑开”原理
最后的面积就是大三角形的面积减去小三角形的面积再加上校园的面积就是所要的答案,这个时候设小圆的半径为r,大圆的半径为R,为了求出小三角形的面积,尽量使用大三角形的面积跟据比例直接得出来,那么就得得出r/R的值,因为(A+B+C)*(R-r)/R+2*pi*r=l,这个不好用语言解释,最后得出r/R=((A+B+C)-l)/(A+B+C-2*pi*R),然后得出小三角形的面积就是S*r/R*r/R
附上代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double pi=acos(-1.0);
double a,b,c,d;
double solve()
{
double l=a+b+c;
double cosa=(b*b+c*c-a*a)/(2*b*c);
double s=0.5*b*c*(sqrt(1-cosa*cosa));
double r=s*2/l;
if(d>l){
return s;
}else{
if(2*pi*r>=d){
return d*d/(4*pi);
}else{
double t=(l-d)/(l-2*pi*r);
double rr=r*t;
return s-s*t*t+pi*rr*rr;
}
}
}
int main()
{
int casen=0;
while(scanf("%lf%lf%lf%lf",&a,&b,&c,&d)!=EOF){
if(!a||!b||!c||!d){
break;
}else{
printf("Case %d: %.2lf\n",++casen,solve());
}
}
return 0;
}