最小圆覆盖模板(zoj1450)

来源:互联网 发布:网络迷情电影 编辑:程序博客网 时间:2024/05/18 17:26
点增量法
#include<iostream>#include<cmath>#include<cstdio>#include<cstring>#define maxn 1005using namespace std; struct tpoint{double x,y;tpoint operator -(const tpoint &a) const{tpoint p1;p1.x=x-a.x;p1.y=y-a.y;return p1;} };struct tcircle{double r;tpoint centre;};struct ttriangle{tpoint t[3];};tcircle c;tpoint a[maxn];double distances(tpoint p1,tpoint p2){tpoint p3;p3.x=p2.x-p1.x;p3.y=p2.y-p1.y;return sqrt(p3.x*p3.x+p3.y*p3.y);}double trianglearea(ttriangle t){tpoint p1,p2;p1=t.t[1]-t.t[0];p2=t.t[2]-t.t[0];return fabs(p1.x*p2.y-p1.y*p2.x)/2;}tcircle circumcircleoftriangle(ttriangle t){tcircle tmp;double a,b,c,c1,c2;double xa,xb,xc,ya,yb,yc;a = distances( t.t[0] , t.t[1] );b=distances(t.t[1],t.t[2]);c=distances(t.t[2],t.t[0]);tmp.r=a*b*c/trianglearea(t)/4;xa=t.t[0].x;ya=t.t[0].y;xb=t.t[1].x;yb=t.t[1].y;xc=t.t[2].x;yc=t.t[2].y;c1=(xa*xa+ya*ya-xb*xb-yb*yb)/2;c2=(xa*xa+ya*ya-xc*xc-yc*yc)/2;tmp.centre.x=(c1*(ya-yc)-c2*(ya-yb))/((xa-xb)*(ya-yc)-(xa-xc)*(ya-yb));tmp.centre.y=(c1*(xa-xc)-c2*(xa-xb))/((ya-yb)*(xa-xc)-(ya-yc)*(xa-xb));return tmp;}tcircle mincircle2(int tce,ttriangle ce){tcircle tmp;if(tce == 0) tmp.r=-2;else if(tce == 1){tmp.centre=ce.t[0];tmp.r=0;}else if(tce == 2){tmp.r=distances(ce.t[0],ce.t[1])/2;tmp.centre.x=(ce.t[0].x+ce.t[1].x)/2;tmp.centre.y=(ce.t[0].y+ce.t[1].y)/2;}else if(tce == 3)tmp=circumcircleoftriangle(ce);return tmp;}void mincircle(int t,int tce,ttriangle ce){int i,j;tpoint tmp;c=mincircle2(tce,ce);if(tce == 3) return ;for(i=1;i<=t;i++){if(distances(a[i],c.centre)>c.r){ce.t[tce]=a[i];mincircle(i-1,tce+1,ce);tmp=a[i];for(j = i;j>=2;j--){a[j]=a[j-1];}a[1]=tmp;}}}void run(int n){ttriangle ce;int i;mincircle(n,0,ce);printf("%.2lf %.2lf %.2lf\n",c.centre.x,c.centre.y,c.r);}int main(){int n;while(scanf("%d",&n)!=EOF && n){for(int i=1;i<=n;i++)scanf("%lf%lf",&a[i].x,&a[i].y);run(n);}return 0;}

原创粉丝点击