1、2023-1-301今天,今天,你你 了吗?了吗?AC第1页/共71页2023-1-302每周一星(每周一星(4):):0705341007053410陈晟陈晟 第2页/共71页2023-1-303第五讲第五讲计算几何初步计算几何初步(Computational Geometry Basic)第3页/共71页2023-1-304第一单元第一单元线段属性线段属性第4页/共71页2023-1-305第5页/共71页2023-1-306第6页/共71页2023-1-307第7页/共71页2023-1-308第8页/共71页2023-1-309第9页/共71页2023-1-3010第10页/共71页2
2、023-1-3011第11页/共71页2023-1-3012第12页/共71页2023-1-3013思考:思考:1 1、传统的计算线段相交的方法是什么?、传统的计算线段相交的方法是什么?2 2、传统方法和本方法的区别是什么?、传统方法和本方法的区别是什么?第13页/共71页2023-1-3014特别提醒:特别提醒:n以上介绍的线段的三个属性,是计以上介绍的线段的三个属性,是计算几何的基础,在很多方面都有应算几何的基础,在很多方面都有应用,比如求凸包等等,请务必掌握!用,比如求凸包等等,请务必掌握!第14页/共71页2023-1-3015第二单元第二单元多边形面积和重心多边形面积和重心第15页/
3、共71页2023-1-3016基本问题(基本问题(1):):n给定一个简单多边形,求其面积。给定一个简单多边形,求其面积。n输入输入:多边形(顶点按逆时针顺:多边形(顶点按逆时针顺序排列)序排列)n输出输出:面积:面积S S第16页/共71页2023-1-3017思考如下图形:思考如下图形:第17页/共71页2023-1-3018Any good idea?第18页/共71页2023-1-3019先看最简单的多边形先看最简单的多边形三角形三角形第19页/共71页2023-1-3020三角形的面积:三角形的面积:n在解析几何里,ABC的面积可以通过如下方法求得:n点坐标=边长 =海伦公式=面积第
4、20页/共71页2023-1-3021思考:此方法的缺点:思考:此方法的缺点:计算量大精度损失更好的方法?第21页/共71页2023-1-3022计算几何的方法:计算几何的方法:n在计算几何里,我们知道,ABC的面积就是“向量AB”和“向量AC”两个向量叉积的绝对值的一半。其正负表示三角形顶点是在右手系还是左手系。ABC成左手系,负面积ABC成右手系,正面积BCACBA第22页/共71页2023-1-3023大功告成:大功告成:nArea(A,B,C)=1/2*(AB)(AC)=/2特别注意:以上得到是有向面积(有正负)有向面积(有正负)!Xb X a Yb Y aXc X a Yc Y a第
5、23页/共71页2023-1-3024凸多边形的三角形剖分凸多边形的三角形剖分n很自然地,我们会想到以 P1为扇面中心,连接P1Pi就得到N-2个三角形,由于凸性,保证这些三角形全在多边形内,那么,这个凸多边形的有向面积:A=sigma(Ai)(i=1N-2)P1P2P3P4P5P6A1A2A3A4第24页/共71页2023-1-3025凹多边形的面积?凹多边形的面积?P1P4P3P2第25页/共71页2023-1-3026依然成立!依然成立!多边形面积公式:A=sigma(Ai)(i=1N-2)结论:“有向面积”A比“面积”S其实更本本质质!第26页/共71页2023-1-3027任意点为扇
6、心的三角形剖分任意点为扇心的三角形剖分:n我们能把多边形分成N-2个三角形,为什么不能分成N个三角形呢?n比如,以多边形内部的一个点为扇心,就可以把多边形剖分成 N个三角形。P0P1P2P6P5P4P3第27页/共71页2023-1-3028前面的三角剖分显然对于多边形内部前面的三角剖分显然对于多边形内部任意一点都是合适的!任意一点都是合适的!我们可以得到:A=sigma(Ai)(i=1N)即:A=sigma /2 (i=1N)Xi X0 Yi Y0X(i+1)X0 Y(i+1)Y0第28页/共71页2023-1-3029能否把扇心移到多边形以外呢?能否把扇心移到多边形以外呢?P0P1P2P3
7、P4第29页/共71页2023-1-3030既然内外都可以,为什么不设既然内外都可以,为什么不设P0为坐标原点呢?为坐标原点呢?OP1P2P3P4现在的公式?第30页/共71页2023-1-3031简化的公式:简化的公式:A=sigma /2(i=1N)Xi YiX(i+1)Y(i+1)面积问题面积问题搞定!搞定!第31页/共71页2023-1-3032基本问题(基本问题(2):):n给定一个简单多边形,求其重心。给定一个简单多边形,求其重心。n输入输入:多边形(顶点按逆时针顺:多边形(顶点按逆时针顺序排列)序排列)n输出输出:重心点:重心点C C第32页/共71页2023-1-3033从三角
8、形的重心谈起:从三角形的重心谈起:三角形的重心是:(x1+x2+x3)/3,(y1+y2+y3)/3可以推广否?Sigma(xi)/N,sigma(yi)/N (i=1N)?第33页/共71页2023-1-3034看看一个特例:看看一个特例:.第34页/共71页2023-1-3035原因:原因:n错误的推广公式是“质点系重心公式”,即如果认为多边形的质量仅分布在其顶点上,且均匀分布,则这个公式是对的。n但是,现在多边形的质量是均匀分布在其内部区域上的,也就是说,是与面积有关的!第35页/共71页2023-1-3036Solution:n剖分成N个三角形,分别求出其重心和面积,这时可以想象,原来
9、质量均匀分布在内部区域上,而现在质量仅仅分布在这N个重心点上(等假变换),这时候就可以利用刚才的质点系重心公式了。n不过,要稍微改一改,改成加权平均加权平均数,因为质量不是均匀分布的,每个质点代表其所在三角形,其质量就是该三角形的面积(有向面积有向面积!),这就是权!第36页/共71页2023-1-3037公式:公式:nC=sigma(Ai*Ci)/A (i=1N)nCi=Centroid(O Pi Pi+1)n =(O+Pi+Pi+1)/3nC=sigma(Pi+Pi+1)(Pi Pi+1)/(6A)第37页/共71页第38页/共71页2023-1-3039第三单元第三单元凸包凸包(Conv
10、ex Hull)(Convex Hull)第39页/共71页2023-1-3040第40页/共71页2023-1-3041第41页/共71页2023-1-3042第42页/共71页2023-1-3043第43页/共71页2023-1-3044第44页/共71页2023-1-3045第45页/共71页2023-1-3046第46页/共71页2023-1-3047第47页/共71页2023-1-3048第48页/共71页2023-1-3049第49页/共71页2023-1-3050第50页/共71页2023-1-3051第51页/共71页2023-1-3052第52页/共71页2023-1-305
11、3第53页/共71页2023-1-3054第54页/共71页2023-1-3055第55页/共71页2023-1-3056第56页/共71页2023-1-3057第57页/共71页2023-1-3058第58页/共71页2023-1-3059第59页/共71页2023-1-3060第60页/共71页2023-1-3061第61页/共71页2023-1-3062第62页/共71页2023-1-3063第63页/共71页2023-1-3064第64页/共71页2023-1-3065第65页/共71页2023-1-3066第66页/共71页2023-1-3067凸包模板:凸包模板:/xiaoxia版
12、#include#include#include typedef structdouble x;double y;POINT;POINT result102;/保存凸包上的点POINT a102;int n,top;double Distance(POINT p1,POINT p2)/两点间的距离return sqrt(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);double Multiply(POINT p1,POINT p2,POINT p3)/叉积 return(p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3
13、.x-p1.x);int Compare(const void*p1,const void*p2)POINT*p3,*p4;double m;p3=(POINT*)p1;p4=(POINT*)p2;m=Multiply(a0,*p3,*p4);if(m0)return 1;else if(m=0&(Distance(a0,*p3)Distance(a0,*p4)return 1;else return-1;void Tubao()int i;result0.x=a0.x;result0.y=a0.y;result1.x=a1.x;result1.y=a1.y;result2.x=a2.x;re
14、sult2.y=a2.y;top=2;for(i=3;i=n;i+)while(Multiply(resulttop-1,resulttop,ai)=0)top-;resulttop+1.x=ai.x;resulttop+1.y=ai.y;top+;int main()int i,p;double px,py,len,temp;while(scanf(%d,&n)!=EOF,n)for(i=0;in;i+)scanf(%lf%lf,&ai.x,&ai.y);if(n=1)printf(0.00n);continue;else if(n=2)printf(%.2lfn,Distance(a0,a
15、1);continue;py=-1;for(i=0;in;i+)if(py=-1|ai.ypy)px=ai.x;py=ai.y;p=i;else if(ai.y=py&ai.xpx)px=ai.x;py=ai.y;p=i;/swap(a0,ap)temp=a0.x;a0.x=ap.x;ap.x=temp;temp=a0.y;a0.y=ap.y;ap.y=temp;qsort(&a1,n-1,sizeof(double)*2,Compare);an.x=a0.x;an.y=a0.y;Tubao();len=0.0;for(i=0;itop;i+)len=len+Distance(resulti,resulti+1);printf(%.2lfn,len);return 0;第67页/共71页Any question?第68页/共71页2023-1-3069课后作业:课后作业:ACM ProgrammingExercise(5)_Geometry 第69页/共71页2023-1-3070下一讲:下一讲:并查集并查集第70页/共71页2023-1-3071Welcome to HDOJWelcome to HDOJThank Thank You You 第71页/共71页