用好模板。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#define zero(x) (((x)>0?(x):-(x))<eps)
#define eps 1.0E-8
#define MAX_POINT_NUM 0
using namespace std;
int double_cmp(double a)
{
if (zero(a))
return 0;
return a > 0 ? 1 : -1;
}
struct Point
{
double x,y;
Point()
{}
Point(double x, double y):x(x), y(y)
{}
Point operator - (Point &a)
{
return Point(x - a.x, y - a.y);
}
Point operator + (Point &a)
{
return Point(x + a.x, y + a.y);
}
bool operator == (const Point &a) const
{
return zero(x - a.x) && zero(y - a.y);
}
};
struct Line
{
Point a, b;
Line()
{}
Line(Point a, Point b):a(a), b(b)
{}
bool operator == (const Line &l) const
{
return l.a == a && l.b == b;
}
};
double cross_product(Point a, Point b)
{
return a.x * b.y - b.x * a.y;
}
double cross_product(Point p0, Point p1, Point p2)
{
return cross_product(p1 - p0, p2 - p0); //p0p1 叉乘 p0p2
}
double vector_module(Point a)
{
return sqrt(a.x * a.x + a.y * a.y); //向量的模
}
double dot_product(Point a, Point b)
{
return a.x * b.x + a.y * b.y; //a点乘 b
}
double dot_product(Point p0, Point p1, Point p2)
{
return dot_product(p1 - p0, p2 - p0); //p0p1 点乘 p0p2
}
double point_dist(Point a, Point b)
{
return vector_module(a - b); //两点间距离
}
bool points_inline(Point p1, Point p2, Point p3) //点p1 在直线p2p3上 即三点共线
{
return zero(cross_product(p1, p2, p3));
}
Point intersection_beeline(Line u,Line v){ //求两直线的交点,斜率相同的话res=u.a
Point res = u.a;
double t = cross_product(u.a - v.a, v.b - v.a) /
cross_product(u.a - u.b, v.b - v.a);
Point vec = u.b - u.a;
vec.x *= t;
vec.y *= t;
res = res + vec;
return res;
}
bool point_incircle(Point o,double r,Point p) { //点p在圆内或圆上
double d2 = (p.x - o.x) * (p.x - o.x) + (p.y - o.y) * (p.y-o.y);
double r2 = r * r;
return d2 < r2 || zero(d2 - r2);
}
bool circumcentre(Point p1, Point p2, Point p3, Point &o, double &r) { //求三角形外心
Line u, v;
if(points_inline(p1, p2, p3)) return false;
Point v12, v13, vert_v12, vert_v13;
v12.x = p2.x - p1.x;
v12.y = p2.y - p1.y;
v13.x = p3.x - p1.x;
v13.y = p3.y - p1.y;
vert_v12.x = - v12.y;
vert_v12.y = v12.x;
vert_v13.x = - v13.y;
vert_v13.y = v13.x;
u.a.x = (p1.x + p2.x) / 2;
u.a.y = (p1.y + p2.y) / 2;
u.b = u.a + vert_v12;
v.a.x=(p1.x + p3.x) / 2;
v.a.y=(p1.y + p3.y) / 2;
v.b = v.a + vert_v13;
o = intersection_beeline(u,v);
r = point_dist(p1, o);
return true;
}
int main() {
int T;
scanf("%d", &T);
int i;
Point p1, p2, p3, p4;
for(i = 1; i <= T; i++) {
scanf("%lf %lf", &p1.x, &p1.y);
scanf("%lf %lf", &p2.x, &p2.y);
scanf("%lf %lf", &p3.x, &p3.y);
scanf("%lf %lf", &p4.x, &p4.y);
Point o;
double r;
if(dot_product(p1, p2, p3) <= 0) { //钝角三角形和三点共线的情况。
r = point_dist(p2, p3) / 2;
o.x = (p2.x + p3.x) / 2;
o.y = (p2.y + p3.y) / 2;
}
else if(dot_product(p2, p1, p3) <= 0) {
r = point_dist(p1, p3) / 2;
o.x = (p1.x + p3.x) / 2;
o.y = (p1.y + p3.y) / 2;
}
else if(dot_product(p3, p1, p2) <= 0) {
r = point_dist(p1, p2) / 2;
o.x = (p1.x + p2.x) / 2;
o.y = (p1.y + p2.y) / 2;
}
else {
circumcentre(p1, p2, p3, o, r);
}
if(point_incircle(o, r, p4)) printf("Case #%d: Danger\n", i);
else printf("Case #%d: Safe\n", i);
}
return 0;
}