最小圆覆盖

来源:互联网 发布:ubuntu 17.10 qq 编辑:程序博客网 时间:2024/05/05 02:00

代码如下:


#include <iostream>#include <stdio.h>#include <math.h>using namespace std;const int N = 1005;struct node{double x, y;}p[N];node center;     //圆心      double radius;   //半径double dis(node s, node t){return sqrt((s.x-t.x)*(s.x-t.x)+(s.y-t.y)*(s.y-t.y));}double multi(node p1, node p2, node p0)     //判断是否是钝角{return (p1.x-p0.x)*(p2.y-p0.y) - (p1.y-p0.y)*(p2.x-p0.x);}void getthirdp(node p1, node p2, int n){center.x = (p1.x+p2.x)/2.0;center.y = (p1.y+p2.y)/2.0;radius = dis(p1, p2)/2.0;int k;double c1,c2;for(k=1;k<=n;k++){if(dis(center, p[k]) <= radius)continue;if(multi(p1, p2, p[k]) != 0.0)   //如果不是钝角{c1 = (p1.x*p1.x+p1.y*p1.y-p2.x*p2.x-p2.y*p2.y)/2.0;c2 = (p1.x*p1.x+p1.y*p1.y-p[k].x*p[k].x-p[k].y*p[k].y)/2.0;center.x=(c1*(p1.y-p[k].y)-c2*(p1.y-p2.y))/((p1.x-p2.x)*(p1.y-p[k].y)-(p1.x-p[k].x)*(p1.y-p2.y));center.y=(c1*(p1.x-p[k].x)-c2*(p1.x-p2.x))/((p1.y-p2.y)*(p1.x-p[k].x)-(p1.y-p[k].y)*(p1.x-p2.x));radius = dis(center,p[k]);}else   //是钝角{double a, b, c;a = dis(p1, p2);b = dis(p1, p[k]);c = dis(p2, p[k]);if(a >= b && a >= c){center.x = (p1.x+p2.x)/2.0;center.y = (p1.y+p2.y)/2.0;radius = a/2.0;}else if(b >= a && b >= c){center.x = (p1.x+p[k].x)/2.0;center.y = (p1.y+p[k].y)/2.0;radius = b/2.0;}else{center.x = (p2.x+p[k].x)/2.0;center.y = (p2.y+p[k].y)/2.0;radius = c/2.0;}}}}void getsecondp(node p1, int n)   {center.x = (p1.x+p[1].x)/2.0;center.y = (p1.y+p[1].y)/2.0;radius = dis(p1, p[1])/2.0;for(int i = 2; i <= n; i ++)if(dis(p[i],center) > radius) getthirdp(p1, p[i], i-1);}int main(){int i, j, n;while(scanf("%d", &n) && n){for(i = 1; i <= n; i ++)scanf("%lf%lf", &p[i].x, &p[i].y);if(n == 1){printf("%.2lf %.2lf 0.00\n", p[1].x, p[1].y);continue;}radius = dis(p[1], p[2])/2.0;center.x = (p[1].x+p[2].x)/2.0;center.y = (p[1].y+p[2].y)/2.0;for(i = 3; i <= n; i ++)if(dis(center, p[i]) > radius)getsecondp(p[i], i-1);printf("%.2lf %.2lf %.2lf\n", center.x, center.y, radius);}return 0;}


原创粉丝点击