题意:给出四点,前三点都在圆上或者圆内,判断第四点是否在圆上或者圆内。
链接:HDU 4720
代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
struct point
{
double x, y;
} a[4];
double rr;//半径
point C, p;
double dis(point a, point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int judge(int d1, int d2, int d3)
{
if(d1*d1 > d2*d2+d3*d3)
{
C.x = (a[1].x+a[2].x)/2.0;
C.y = (a[1].y+a[2].y)/2.0;
rr = d1/2.0;
return 1;
}
else if(d2*d2 > d1*d1+d3*d3)
{
C.x = (a[1].x+a[3].x)/2.0;
C.y = (a[1].y+a[3].y)/2.0;
rr = d2/2.0;
return 1;
}
else if(d3*d3 > d1*d1+d2*d2)
{
C.x = (a[2].x+a[3].x)/2.0;
C.y = (a[2].y+a[3].y)/2.0;
rr = d3/2.0;
return 1;
}
return 0;
}
int main()
{
int t;
int cas = 0;
scanf("%d",&t);
while(t--)
{
for(int i = 1; i <= 3; i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
}
scanf("%lf%lf",&p.x,&p.y);
double d1 = dis(a[1], a[2]);
double d2 = dis(a[1], a[3]);
double d3 = dis(a[2], a[3]);
printf("Case #%d: ",++cas);
if(judge(d1,d2,d3))//如果是钝角
{
double disl = dis(p,C);
if(disl > rr)
{
printf("Safe\n");
}
else
{
printf("Danger\n");
}
}
else
{
double x1 = a[1].x, y1 = a[1].y;
double x2 = a[2].x, y2 = a[2].y;
double x3 = a[3].x, y3 = a[3].y;
C.x = ((y3-y1)*(y2*y2-y1*y1+x2*x2-x1*x1)+(y2-y1)*(y1*y1-y3*y3+x1*x1-x3*x3))/(2*(x2-x1)*(y3-y1)-2*(x3-x1)*(y2-y1));
C.y = ((x3-x1)*(x2*x2-x1*x1+y2*y2-y1*y1)+(x2-x1)*(x1*x1-x3*x3+y1*y1-y3*y3))/(2*(y2-y1)*(x3-x1)-2 *(y3-y1)*(x2-x1));
double disl = dis(p,C);
rr = dis(C,a[1]);
if(disl > rr)
{
printf("Safe\n");
}
else
{
printf("Danger\n");
}
}
}
return 0;
}