各位大牛!
帮帮小弟吧。我实在搞不清这最小覆盖圆中的递归是怎么回事。麻烦帮小弟解释一下吧。如果有具体算法解释一下,我感激不尽了。
# include <stdio.h>
# include <math.h>
# include <time.h>
# include <stdlib.h>
# include <functional>
# include <algorithm>
using namespace std;
# define MAX 100
struct point{
double x,y;
}p[MAX],Q[3];
struct circle{
double r;
point o;
};
const double eps=1e-10;
int m;
double dis(point p1,point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
point Solve(point p[])
{
double A1,A2,B1,B2,C1,C2;
point o;
A1=p[0].x-p[1].x;
B1=p[0].y-p[1].y;
C1=(p[0].x*p[0].x+p[0].y*p[0].y-p[1].x*p[1].x-p[1].y*p[1].y)*0.5;
A2=p[0].x-p[2].x;
B2=p[0].y-p[2].y;
C2=(p[0].x*p[0].x+p[0].y*p[0].y-p[2].x*p[2].x-p[2].y*p[2].y)*0.5;
o.x=(C1*B2-C2*B1)/(A1*B2-A2*B1);
o.y=(A1*C2-A2*C1)/(A1*B2-A2*B1);
return o;
}
circle MINC(int n)
{
circle c;
int i;
if(n==0||m==3) {
if(m==1) {
c.o=Q[0];
c.r=0;
}
else if(m==2){
c.o.x=(Q[0].x+Q[1].x)*0.5;
c.o.y=(Q[0].y+Q[1].y)*0.5;
c.r=dis(Q[0],Q[1])*0.5;
}
else {
c.o=Solve(Q);
c.r=dis(c.o,Q[0]);
}
return c;
}
if(m==0&&n==1){
c.o=p[0];
c.r=0;
}
else c=MINC(n-1);
if(dis(c.o,p[n-1])>c.r+eps) {
Q[m++]=p[n-1];
c=MINC(n-1);
m--;
}
return c;
}
int main()
{
int n,i;
circle c;
srand((unsigned)time(NULL));
while(scanf("%d",&n)!=EOF){
if(n==0) break;
for(i=0;i<n;i++) scanf("%lf%lf",&p.x,&p.y);
random_shuffle(&p[0],&p[n]);
m=0;
c=MINC(n);
printf("%.2lf %.2lf %.2lf\n",c.o.x,c.o.y,c.r);
}
return 0;
}