ACM国际大学生程序设计竞赛 -计算几何(源码).doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:65 大小:307KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

ACM国际大学生程序设计竞赛 -计算几何(源码).doc

ACM国际大学生程序设计竞赛-计算几何(源码).doc

预览

免费试读已结束,剩余 55 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

(1)凸包/*凸包cug_1038*/#include<stdio.h>#include<stdlib.h>structpoint{intx,y;}pp;pointp[100005];intstack[100005],top;intdis(pointa,pointb){return((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}intmulti(pointb,pointc,pointa){return(b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);}voidswap(pointp[],ints,intt){pointtmp;tmp=p[s];p[s]=p[t];p[t]=tmp;}intcmp(constvoid*a,constvoid*b){point*c=(point*)a;point*d=(point*)b;doublek=multi(*c,*d,pp);if(k<0)return1;elseif(k==0&&dis(*c,pp)>=dis(*d,pp))return1;elsereturn-1;}voidGraham(pointp[],intn,intstack[],int&top){inti,u;u=0;for(i=1;i<n;i++){if(p[i].y==p[u].y&&p[i].x<p[u].x)u=i;elseif(p[i].y<p[u].y)u=i;}swap(p,0,u);pp=p[0];qsort(p+1,n-1,sizeof(p[0]),cmp);stack[0]=0;stack[1]=1;top=1;for(i=2;i<n;i++){while(multi(p[i],p[stack[top]],p[stack[top-1]])>=0){if(top==0)break;top--;}top++;stack[top]=i;}}intmain(){intca,i,j,n;intarea;scanf("%d",&ca);for(i=1;i<=ca;i++){scanf("%d",&n);for(j=0;j<n;j++){scanf("%d%d",&p[j].x,&p[j].y);}Graham(p,n,stack,top);area=0;for(j=1;j<=top-1;j++){area+=abs(multi(p[stack[0]],p[stack[j]],p[stack[j+1]]));}printf("%.1lf\n",(double)area/2);}return0;}---------------------------------------------------------------------------------------------------------------------(2)判断两条线段是否相交(平行,不平行)boolisIntersected(TPoints1,TPointe1,TPoints2,TPointe2){//判断线段是否相交//1.快速排斥试验判断以两条线段为对角线的两个矩形是否相交//2.跨立试验if((max(s1.x,e1.x)>=min(s2.x,e2.x))&&(max(s2.x,e2.x)>=min(s1.x,e1.x))&&(max(s1.y,e1.y)>=min(s2.y,e2.y))&&(max(s2.y,e2.y)>=min(s1.y,e1.y))&&(multi(s2,e1,s1)*multi(e1,e2,s1)>=0)&&(multi(s1,e2,s2)*multi(e2,e1,s2)>=0))returntrue;returnfalse;}(3)三角形的外接圆(已知不在同一直线上的三点求经过三点的圆)/*三角形的外接圆pku_1329*/#include<stdio.h>#include<math.h>constdoubleeps=1e-6;typedefstructTPoint{doublex;doubley;}TPoint;typedefstructTTriangle{TPointt[3];}TTriangle;typedefstructTCircle{TPointcentre;doubler;}TCircle;doubledistance(TPointp1,TPointp2){//计算平面上两个点之