给定三角形,求三个两两相切且与三角形的一条边相切的圆的半径。
二分一个半径,可以得出另外两个半径,需要推一推公式(太久了,我忘记了)
#include<cstdio>
#include<cmath>
#define eps (1e-8)
#define sqr(a) (a)*(a)
#define min(a,b) (a)>(b)?(b):(a)
#define dd double
struct point{
dd x,y,v,a;//点x,y,v为角度,a为边长
}q[];
dd r0,r1,r2,r3;
int read(){
int f=;
for(int i=;i<;i++){
scanf("%lf%lf",&q[i].x,&q[i].y);
if(q[i].x||q[i].y) f=;
}
return f;
}
dd make(dd r,dd a,dd h,dd n){
dd t=r-r/tan(h)/tan(n)+a/tan(n);
if(t<=eps)return -;
return sqr((sqrt(t)-sqrt(r))*tan(n));
}
void solve(){
dd l=,r=min(q[].a*tan(q[].v),q[].a*tan(q[].v));
while(r-l>eps){
r0=(l+r)/;
r1=make(r0,q[].a,q[].v,q[].v);
r2=make(r0,q[].a,q[].v,q[].v);
if(r1<=eps||r2<=eps||r2/tan(q[].v)+r1/tan(q[].v)+*sqrt(r2*r1)-q[].a<eps)
r=r0;
else
l=r0;
}
}
int main(){
while(read())
{
for(int i=;i<;i++)
q[i].a=sqrt(sqr(q[(i+)%].x-q[i].x)+sqr(q[(i+)%].y-q[i].y));//计算边长
for(int i=;i<;i++)
q[i].v=acos((sqr(q[i].a)+sqr(q[(i+)%].a)-sqr(q[(i+)%].a))//q[i].a/q[(i+)%].a)/;
solve();
printf("%lf %lf %lf\n",r0,r1,r2);
}
}