1 / 5
文档名称:

凸包代码 例举.doc

格式:doc   大小:25KB   页数:5页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

凸包代码 例举.doc

上传人:xyb333199 2019/7/31 文件大小:25 KB

下载得到文件列表

凸包代码 例举.doc

相关文档

文档介绍

文档介绍:#include<>#include<>#include<>typedefstruct{ doublex; doubley;}POINT;POINTresult[102]; //保存凸包上的点POINTa[102]; intn,top;doubleDistance(POINTp1,POINTp2) //两点间的距离{ returnsqrt((-)*(-)+(-)*(-));}doubleMultiply(POINTp1,POINTp2,POINTp3)//叉积{ return((-)*(-)-(-)*(-));}pare(constvoid*p1,constvoid*p2){ POINT*p3,*p4; doublem;p3=(POINT*)p1;p4=(POINT*)p2; m=Multiply(a[0],*p3,*p4); if(m<0)return1; elseif(m==0&&(Distance(a[0],*p3)<Distance(a[0],*p4))) return1; elsereturn-1;}voidTubao(){inti;result[0].x=a[0].x;result[0].y=a[0].y;result[1].x=a[1].x;result[1].y=a[1].y;result[2].x=a[2].x;result[2].y=a[2].y;top=2;for(i=3;i<=n;i++){while(Multiply(result[top-1],result[top],a[i])<=0&&top>2) top--;result[top+1].x=a[i].x;result[top+1].y=a[i].y;top++;}}intmain(){inti,p;doublepx,py,len,temp;while(scanf("%d",&n)!=EOF,n){for(i=0;i<n;i++)scanf("%lf%lf",&a[i].x,&a[i].y);if(n==1){printf("\n");continue;}elseif(n==2){printf("%.2lf\n",Distance(a[0],a[1]));continue;}py=-1;for(i=0;i<n;i++) {if(py==-1||a[i].y<py){px=a[i].x;py=a[i].y; p=i;}elseif(a[i].y==py&&a[i].x<px){px=a[i].x;py=a[i].y; p=i;} } //swap(a[0],a[p]) temp=a[0].x; a[0].x=a[p].x; a[p].x=temp; temp=a[0].y; a[0].y=a[p].y; a[p].y=temp;qsort(&a[1],n-1,sizeof(double)*pare);a[n].x=a[0].x;a[n].y=a[0].y;Tubao();len=;for(i=0;i<top;i++)len=len+Distance(result[i],result[i+1])