题意:
给三角形的三点坐标个一段长为L的绳,求绳子在三角形内最多能围多大面积。
分析:
难点是绳长大于三角形内接圆半径又小于三角形周长的情况,这种情况绳子在三角形内形成三段直线和三段弧,其中三段弧组成一个小圆(有从物理方面的证明)。求出比例后即可算面积。
代码:
//poj 1927
//sep9
#include <iostream>
#include <cmath>
using namespace std;
const double pi=acos(-1.0);
int main()
{
double a,b,c,l;
int cases=0;
while(scanf("%lf%lf%lf%lf",&a,&b,&c,&l)==4){
if(fabs(a)<1e-6&&fabs(b)<1e-6&&fabs(c)<1e-6&&fabs(l)<1e-6)
break;
double p=(a+b+c)/2;
double S=sqrt(p*(p-a)*(p-b)*(p-c));
double R=S/p;
if(l>=a+b+c)
printf("Case %d: %.2lf\n",++cases,S);
else if(l<=pi*2*R)
printf("Case %d: %.2lf\n",++cases,l*l/(4*pi));
else{
double r=R*(2*p-l)/(2*p-2*pi*R);// perimeter of small:2*p-l+2*pi*r
double s=S*(r/R)*(r/R);
printf("Case %d: %.2lf\n",++cases,S-s+pi*r*r);
}
}
return 0;
}