HDU1791三点确定一个圆

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <stack>
 9 #include <queue>
10 #include <cassert>
11 #include <set>
12 #include <sstream>
13 #include <map>
14 using namespace std ;
15 #ifdef DeBUG
16 #define bug assert
17 #else
18 #define bug //
19 #endif
20 #define zero {0}
21 #define INF 2000000000
22 #define EPS 1e-10
23 inline int sgn(double x)//sgn函数符号判断 ,小于给定精度判零
24 {
25     return fabs(x) < EPS ? 0 :(x < 0 ? -1 : 1);
26 }
27 struct POINT
28 {
29     double x;
30     double y;
31     POINT()
32     {
33     }
34     POINT(double a,double b):x(a),y(b)
35     {
36     }
37 };
38 double dist(POINT p,POINT r)
39 {
40     return sqrt((p.x-r.x)*(p.x-r.x)+(p.y-r.y)*(p.y-r.y));
41 }
42 bool cocircle(POINT p1,POINT p2,POINT p3,POINT &q,double &r)
43 {
44     double x12=p2.x-p1.x;
45     double y12=p2.y-p1.y;
46     double x13=p3.x-p1.x;
47     double y13=p3.y-p1.y;
48     double z2=x12*(p1.x+p2.x)+y12*(p1.y+p2.y);
49     double z3=x13*(p1.x+p3.x)+y13*(p1.y+p3.y);
50     double d=2.0*(x12*(p3.y-p2.y)-y12*(p3.x-p2.x));
51     if(abs(d)<EPS)                           //共线,圆不存在
52         return false;
53     q.x=(y13*z2-y12*z3)/d;
54     q.y=(x12*z3-x13*z2)/d;
55     r=dist(p1,q);
56     return true;
57 }
58 int main()
59 {
60 #ifdef DeBUGn
61 
62     freopen("C:\Users\Sky\Desktop\1.in","r",stdin);
63 #endif
64     int T;
65     double x1,x2,x3,y1,y2,y3;
66     scanf("%d",&T);
67     while(T--)
68     {
69         POINT xin;
70         double r;
71         cin>>x1>>y1>>x2>>y2>>x3>>y3;
72  /*
73        if(sgn((x3-x1)*(y2-y1)-(y3-y1)*(x2-x1))==0)
74             printf("No this position
");
75         else
76         {*/
77             if(cocircle(POINT(x1,y1),POINT(x2,y2),POINT(x3,y3),xin,r))
78             printf("%.1lf %.1lf
",xin.x,xin.y);
79             else if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3))//知道数据了这里偷个懒呵呵,应判断两点中点 
80             printf("%.1lf %.1lf
",(x1+x2+x3)/2,(y1+y2+y3)/2);
81             else
82             printf("No this position
");
83         //}
84     }
85     return 0;
86 }
View Code
原文地址:https://www.cnblogs.com/Skyxj/p/3227904.html