Here is my code...
Code: Select all
#include <stdio.h>
#include <math.h>
#include <string.h>
inline long double absx(long double x){
return x-0>1.0e-8?x:-x;
}
char buffer[10];
int main(){
int v;
long double cx,cy,r,x0,y0;
double cxx,cyy,rr,xx0,yy0;
double k1,k2,dist;
int count=0;
scanf("%d",&v);
while(v--){
scanf("%lf%lf%lf%lf%lf",&cyy,&cxx,&rr,&yy0,&xx0);
cy=cyy;cx=cxx;r=rr;y0=yy0;x0=xx0;
strcpy(buffer,"");
if(cx<1.0e-8) {cx=-cx;x0=-x0;}
if(cy<1.0e-8) {cy=-cy;y0=-y0;}
if(absx(cx-r)<1.0e-8){
dist=cx;
cx=cy;
cy=dist;
dist=x0;
x0=y0;
y0=dist;
}
if(r<0||cx*cx+cy*cy<=r*r)
printf("0.000\n");
else{
if(absx(cx-r)<1.0e-8&&absx(cy-r)<1.0e-8){
if((x0<1.0e-8||y0<1.0e-8)||x0*x0+y0*y0-r*r<1.0e-8)//Tanglet with axis
printf("0.000\n");
else{
dist=sqrtl((x0-cx)*(x0-cx)+(y0-cy)*(y0-cy))-r;
if(dist>absx(x0)) dist=absx(x0);
if(dist>absx(y0)) dist=absx(y0);
if(dist-0<-1.0e-8)
printf("0.000\n");
else
printf("%.3lf\n",dist);
}
}
else{
/*k1=(-cx*cy-sqrt(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))/(r*r-cx*cx);
k2=(r*r-cy*cy)/(-cx*cy-sqrt(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)));*/
if((((-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))/(r*r-cx*cx)*x0-y0)*((-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))/(r*r-cx*cx)*cx-cy)<-1.0e-8||
((r*r-cy*cy)/(-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))*x0-y0)*((r*r-cy*cy)/(-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))*cx-cy)<-1.0e-8)||
cx*cx+cy*cy-r*r-x0*x0-y0*y0>1.0e-8)
printf("0.000\n");
else{
dist=sqrtl((x0-cx)*(x0-cx)+(y0-cy)*(y0-cy))-r;
if(dist-absx(y0-(-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))/(r*r-cx*cx)*x0)/sqrtl(1+(-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))/(r*r-cx*cx)*(-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))/(r*r-cx*cx))>1.0e-8)
dist=absx(y0-(-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))/(r*r-cx*cx)*x0)/sqrtl(1+(-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))/(r*r-cx*cx)*(-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))/(r*r-cx*cx));//Try to avoid rounding error...
if(dist-absx(y0-(r*r-cy*cy)/(-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))*x0)/sqrtl(1+(r*r-cy*cy)/(-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))*(r*r-cy*cy)/(-cx*cy-sqrt(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx))))>1.0e-8)
dist=absx(y0-(r*r-cy*cy)/(-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))*x0)/sqrtl(1+(r*r-cy*cy)/(-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx)))*(r*r-cy*cy)/(-cx*cy-sqrtl(cx*cx*cy*cy-(r*r-cy*cy)*(r*r-cx*cx))));
if(dist<-1.0e-8) printf("0.000\n");
else
printf("%.3lf\n",dist);
}
}
}
}
return 0;
}