最小圆覆盖
1 struct TPoint 2 { 3 double x, y; 4 TPoint operator-(TPoint &a) 5 { 6 TPoint p1; 7 p1.x = x - a.x; 8 p1.y = y - a.y; 9 return p1; 10 } 11 }; 12 13 struct TCircle 14 { 15 double r; 16 TPoint centre; 17 }; 18 19 struct TTriangle 20 { 21 TPoint t[3]; 22 }; 23 24 TCircle c; 25 TPoint a[maxn]; 26 27 double distance(TPoint p1, TPoint p2) 28 { 29 TPoint p3; 30 p3.x = p2.x - p1.x; 31 p3.y = p2.y - p1.y; 32 return sqrt(p3.x * p3.x + p3.y * p3.y); 33 } 34 35 double triangleArea(TTriangle t) 36 { 37 TPoint p1, p2; 38 p1 = t.t[1] - t.t[0]; 39 p2 = t.t[2] - t.t[0]; 40 return fabs(p1.x * p2.y - p1.y * p2.x) / 2; 41 } 42 43 TCircle circumcircleOfTriangle(TTriangle t) 44 { 45 //三角形的外接圆 46 TCircle tmp; 47 double a, b, c, c1, c2; 48 double xA, yA, xB, yB, xC, yC; 49 a = distance(t.t[0], t.t[1]); 50 b = distance(t.t[1], t.t[2]); 51 c = distance(t.t[2], t.t[0]); 52 //根据S = a * b * c / R / 4;求半径R 53 tmp.r = a * b * c / triangleArea(t) / 4; 54 55 xA = t.t[0].x; yA = t.t[0].y; 56 xB = t.t[1].x; yB = t.t[1].y; 57 xC = t.t[2].x; yC = t.t[2].y; 58 c1 = (xA * xA + yA * yA - xB * xB - yB * yB) / 2; 59 c2 = (xA * xA + yA * yA - xC * xC - yC * yC) / 2; 60 61 tmp.centre.x = (c1 * (yA - yC) - c2 * (yA - yB)) / 62 ((xA - xB) * (yA - yC) - (xA - xC) * (yA - yB)); 63 tmp.centre.y = (c1 * (xA - xC) - c2 * (xA - xB)) / 64 ((yA - yB) * (xA - xC) - (yA - yC) * (xA - xB)); 65 66 return tmp; 67 } 68 69 TCircle MinCircle2(int tce, TTriangle ce) 70 { 71 TCircle tmp; 72 if(tce == 0) tmp.r = -2; 73 else if(tce == 1) 74 { 75 tmp.centre = ce.t[0]; 76 tmp.r = 0; 77 } 78 else if(tce == 2) 79 { 80 tmp.r = distance(ce.t[0], ce.t[1]) / 2; 81 tmp.centre.x = (ce.t[0].x + ce.t[1].x) / 2; 82 tmp.centre.y = (ce.t[0].y + ce.t[1].y) / 2; 83 } 84 else if(tce == 3) tmp = circumcircleOfTriangle(ce); 85 return tmp; 86 } 87 88 void MinCircle(int t, int tce, TTriangle ce) 89 { 90 int i, j; 91 TPoint tmp; 92 c = MinCircle2(tce, ce); 93 if(tce == 3) return; 94 for(i = 1;i <= t;i++) 95 { 96 if(distance(a[i], c.centre) > c.r) 97 { 98 ce.t[tce] = a[i]; 99 MinCircle(i - 1, tce + 1, ce); 100 tmp = a[i]; 101 for(j = i;j >= 2;j--) 102 { 103 a[j] = a[j - 1]; 104 } 105 a[1] = tmp; 106 } 107 } 108 } 109 110 void run(int n) 111 { 112 TTriangle ce; 113 int i; 114 MinCircle(n, 0, ce); 115 printf("%.2lf %.2lf %.2lf\n", c.centre.x, c.centre.y, c.r); 116 } 117 118 int main() 119 { 120 freopen("circle.in", "r", stdin); 121 freopen("out.txt", "w", stdout); 122 int n; 123 while(scanf("%d", &n) != EOF && n) 124 { 125 for(int i = 1;i <= n;i++) 126 scanf("%lf%lf", &a[i].x, &a[i].y); 127 run(n); 128 } 129 return 0; 130 }