ZJU 1450 Minimal Circle(平面点集最小圆覆盖)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=450

假设当前集合点的最小圆覆盖已经找到,那么现在再加入集合一个点,两种情况,这个点本来就在这个圆内,那么等于不用处理

如果这个点在当前圆外,那么可以确定这个点一定是在加入这个点的点集的最小圆覆盖的圆上的点!

如果能够确定三个点在圆上,那么这个圆心就确定了!

《计算几何-算法与应用》4.7节解释的很详细!

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <cmath>
using namespace std;
#define maxn 150
struct point{
    double x,y;
    point(double _x=0,double _y=0):x(_x),y(_y){}
}po[maxn],cir;
int n;
double r;
double dis(point &a,point &b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double my_sqr(double &x)
{
    return x*x;
}
void Circle(point P0,point P1,point P2,point &o)//外接圆圆心
{
    double a1=P1.x-P0.x,b1=P1.y-P0.y,c1=(my_sqr(a1)+my_sqr(b1))/2;
    double a2=P2.x-P0.x,b2=P2.y-P0.y,c2=(my_sqr(a2)+my_sqr(b2))/2;
    double d=a1*b2-a2*b1;
    o.x=P0.x+(c1*b2-c2*b1)/d;
    o.y=P0.y+(a1*c2-a2*c1)/d;
}
int cal_cir(point *p,int n){
    int i,j,k;
    r=0,cir=po[0];
    for(i=1;i<n;i++){//确定第一个在圆上的点
        if(dis(cir,po[i])<=r) continue;
        r=0,cir=po[i];
        for(j=0;j<i;j++){//确定第二个在圆上的点
            if(dis(cir,po[j])<=r) continue;
            cir=point((po[i].x+po[j].x)/2,(po[i].y+po[j].y)/2);
            r=dis(po[i],po[j])/2;
            for(k=0;k<j;k++) if(dis(po[k],cir)<=r) continue;//确定第三个,如果没有也没关系
            else{
                Circle(po[i],po[j],po[k],cir);
                r=dis(cir,po[i]);
            }
        }
    }
    return 0;
}
int main(){
    int i,j,k;
    while(scanf("%d",&n),n){
        for(i=0;i<n;i++)
        scanf("%lf%lf",&po[i].x,&po[i].y);
        cal_cir(po,n);
        printf("%.2lf %.2lf %.2lf\n",cir.x,cir.y,r);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值