最小圆覆盖

要求一个半径最小的圆覆盖住所有的点

采用随机增量的方法,每次找到一个不在当前圆内的点,将圆调整扩大至该点在圆周上。期望复杂度为O(n).

输入:a 需要覆盖的所有点

          n 点的个数

输出:center全局变量,最小覆盖圆的圆心

           radius全局变量,最小覆盖圆的半径

设有三个点

p1相对于p0的坐标为(p1.x-p0.x,p1.y-p0.y)

p2相对于p0的坐标为(p2.x-p0.x,p2.y-p0.y)

struct point{
	double x,y;
};


void circle_center(point p0,point p1,point p2,point &cp){//三个点在圆的边界上,求这个圆心坐标
	double a1=p1.x-p0.x,b1=p1.y-p0.y,c1=(a1*a1+b1*b1)/2;
	double a2=p2.x-p0.x,b2=p2.y-p0.y,c2=(a2*a2+b2*b2)/2;
	double d=a1*b2-a2*b1;
	cp.x=p0.x+(c1*b2-c2*b1)/d;
	cp.y=p0.y+(a1*c2-a2*c1)/d;
}


void circle_center(point p0,point p1,point &cp){//两个点是圆的直径的两头,求这个圆
	cp.x=(p0.x+p1.x)/2;
	cp.y=(p0.y+p1.y)/2;
}


point center;
double radius;
double dist(point a,point b){
	double x=a.x-b.x;
	double y=a.y-b.y;
	return x*x+y*y;
}




bool point_in(const point &p){
	return (dist(p,center)-radius)<0;
}

//在进行这个算法前,所有点随机打乱
void min_circle_cover(point a[],int n){
	radius=0;
	center=a[0];
	for(int i=1;i		center=a[i];radius=0;
		for(int j=0;j			circle_center(a[i],a[j],center);
			radius=dist(a[j],center);
			for(int k=0;k				circle_center(a[i],a[j],a[k],center);
				radius=dist(a[k],center);


			}
		}
	}}




你可能感兴趣的:(C++,几何)