切换到宽版
  • 6234阅读
  • 3回复

帮帮忙解释一下这最小覆盖圆的算法 [复制链接]

上一主题 下一主题
离线ice
 
只看楼主 倒序阅读 0 发表于: 2006-04-07
各位大牛!
帮帮小弟吧。我实在搞不清这最小覆盖圆中的递归是怎么回事。麻烦帮小弟解释一下吧。如果有具体算法解释一下,我感激不尽了。
# 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;
}
离线archimedes

只看该作者 1 发表于: 2006-04-09
random_shuffle是什么?
最好给Pascal代码
离线ice
只看该作者 2 发表于: 2006-04-10
我学的是C++。random_shuffle没什么,只是把数据打乱了。
离线archimedes

只看该作者 3 发表于: 2006-04-12
拿回去看一看~
快速回复
限100 字节
 
上一个 下一个