题意:前三个点坐标,要找到一个最小的圆能覆盖这三个点;若第四个点在这个圆外则输出Safe,否则输出 Danger;
前三个点确定一个三角形,若这个三角形是直角三角形或钝角三角形,则圆心在最长边的中点,半径是其一半;
如果为锐角三角形,
则利用公式;
x0=((y2-y1)*(y3*y3-y1*y1+x3*x3-x1*x1)-(y3-y1)*(y2*y2-y1*y1+x2*x2-x1*x1))/(2.0*((x3-x1)*(y2-y1)-(x2-x1)*(y3-y1)));
y0=((x2-x1)*(x3*x3-x1*x1+y3*y3-y1*y1)-(x3-x1)*(x2*x2-x1*x1+y2*y2-y1*y1))/(2.0*((y3-y1)*(x2-x1)-(y2-y1)*(x3-x1)));
r=sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));
#include"stdio.h"
#include"string.h"
#include"math.h"
double fun(double a1,double b1,double a2,double b2)
{
return sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2));
}
int main()
{
int r1=1,k;
double x1,x2,x3,y1,y2,y3,a,b,c,p1,p2,r,x0,y0;
scanf("%d",&k);
while(k--)
{
scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
scanf("%lf%lf",&p1,&p2);
a=fun(x1,y1,x2,y2);
b=fun(x1,y1,x3,y3);
c=fun(x2,y2,x3,y3);
if(c*c-a*a-b*b>0)
{
x0=(x2+x3)/2.0;
y0=(y2+y3)/2.0;
r=c/2.0;
}
else if(a*a-b*b-c*c>0)
{
x0=(x1+x2)/2.0;
y0=(y1+y2)/2.0;
r=a/2.0;
}
else if(b*b-c*c-a*a>0)
{
x0=(x1+x3)/2.0;
y0=(y1+y3)/2.0;
r=b/2.0;
}
else
{
x0=((y2-y1)*(y3*y3-y1*y1+x3*x3-x1*x1)-(y3-y1)*(y2*y2-y1*y1+x2*x2-x1*x1))/(2.0*((x3-x1)*(y2-y1)-(x2-x1)*(y3-y1)));
y0=((x2-x1)*(x3*x3-x1*x1+y3*y3-y1*y1)-(x3-x1)*(x2*x2-x1*x1+y2*y2-y1*y1))/(2.0*((y3-y1)*(x2-x1)-(y2-y1)*(x3-x1)));
r=sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));
}
printf("Case #%d: ",r1++);
if((p1-x0)*(p1-x0)+(p2-y0)*(p2-y0)<=r*r)
printf("Danger\n");
else
printf("Safe\n");
}
return 0;
}