2020/4/151ACM程序设计信息学院计算机应用系余腊生2020/4/152今天,你了吗?2020/4/153每周一星(5):♂=HW---木阳♂2020/4/154第六讲计算几何初步(ComputationalGeometryBasic)2020/4/155第一单元线段属性2020/4/1562020/4/1572020/4/1582020/4/1592020/4/15102020/4/15112020/4/15122020/4/15132020/4/1514思考:1、传统的判断线段相交的方法是什么?2、传统方法和本方法的区别是什么?2020/4/1515特别提醒:以上介绍的线段的三个属性,是计算几何的基础,在很多方面都有应用,比如求凸包等等,请务必掌握!2020/4/1516第二单元多边形面积和重心2020/4/1517基本问题(1):给定一个简单多边形,求其面积。输入:多边形(顶点按逆时针顺序排列)输出:面积S2020/4/1518思考如下图形:2020/4/1519Anygoodidea?2020/4/1520先讨论最简单的多边形——三角形2020/4/1521三角形的面积:在解析几何里,△ABC的面积可以通过如下方法求得:点坐标=边长=海伦公式=面积2020/4/1522思考:此方法的缺点:计算量大精度损失更好的方法?2020/4/1523计算几何的方法:在计算几何里,我们知道,△ABC的面积就是“向量AB”和“向量AC”两个向量叉积的绝对值的一半。其正负表示三角形顶点是在右手系还是左手系。ABC成左手系,负面积ABC成右手系,正面积BCACBA2020/4/1524大功告成:Area(A,B,C)=1/2*(↑AB)×(↑AC)=∣∣/2特别注意:以上得到是有向面积(有正负)!Xb–XaYb–YaXc–XaYc–Ya2020/4/1525凸多边形的三角形剖分很自然地,我们会想到以P1为扇面中心,连接P1Pi就得到N-2个三角形,由于凸性,保证这些三角形全在多边形内,那么,这个凸多边形的有向面积:A=sigma(Ai)(i=1…N-2)P1P2P3P4P5P6A1A2A3A42020/4/1526凹多边形的面积?P1P4P3P22020/4/1527依然成立!!!多边形面积公式:A=sigma(Ai)(i=1…N-2)结论:“有向面积”A比“面积”S其实更本质!2020/4/1528任意点为扇心的三角形剖分:我们能把多边形分成N-2个三角形,为什么不能分成N个三角形呢?比如,以多边形内部的一个点为扇心,就可以把多边形剖分成N个三角形。P0P1P2P6P5P4P32020/4/1529前面的三角剖分显然对于多边形内部任意一点都是合适的!我们可以得到:A=sigma(Ai)(i=1…N)即:A=sigma∣∣/2(i=1…N)Xi–X0Yi–Y0X(i+1)–X0Y(i+1)–Y02020/4/1530能不能把扇心移到多边形以外呢?P0P1P2P3P42020/4/1531既然内外都可以,为什么不设P0为坐标原点呢?OP1P2P3P4现在的公式?2020/4/1532简化的公式:A=sigma∣∣/2(i=1…N)XiYiX(i+1)Y(i+1)面积问题搞定!2020/4/1533基本问题(2):给定一个简单多边形,求其重心。输入:多边形(顶点按逆时针顺序排列)输出:重心点C2020/4/1534从三角形的重心谈起:三角形的重心是:(x1+x2+x3)/3,(y1+y2+y3)/3可以推广否?Sigma(xi)/N,sigma(yi)/N(i=1…N)???2020/4/1535看看一个特例:2020/4/1536原因:错误的推广公式是“质点系重心公式”,即如果认为多边形的质量仅分布在其顶点上,且均匀分布,则这个公式是对的。但是,现在多边形的质量是均匀分布在其内部区域上的,也就是说,是与面积有关的!2020/4/1537Solution:剖分成N个三角形,分别求出其重心和面积,这时可以想象,原来质量均匀分布在内部区域上,而现在质量仅仅分布在这N个重心点上(等假变换),这时候就可以利用刚才的质点系重心公式了。不过,要稍微改一改,改成加权平均数,因为质量不是均匀分布的,每个质点代表其所在三角形,其质量就是该三角形的面积(有向面积!),——这就是权!2020/4/1538公式:C=sigma(Ai*Ci)/A(i=1…N)Ci=Centroid(△OPiPi+1)=(O+↑Pi+↑Pi+1)/3C=sigma((↑Pi+↑Pi+1)(↑Pi×↑Pi+1))/(6A)2020/4/1539全部搞定!2020/4/1540第三单元凸包(ConvexHull)2020/4/15412020/4/15422020/4/15432020/4/15442020/4/15452020/4/15462020/4/15472020/4/15482020/4/15492020/4/15502020/4/15512020/4/15522020/4/15532020/4/15542020/4/15552020/4/15562020/4/15572020/4/15582020/4/15592020/4/15602020/4/15612020/4/15622020/4/15632020/4/15642020/4/15652020/4/15662020/4/15672020/4/1568凸包模板://xiaoxia版#includestdio.h#includemath.h#includestdlib.htypedefstruct{doublex;doubley;}POINT;POINTresult[102];//保存凸包上的点POINTa[102];intn,top;doubleDistance(POINTp1,POINTp2)//两点间的距离{returnsqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}doubleMultiply(POINTp1,POINTp2,POINTp3)//叉积{return((p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x));}intCompare(constvoid*p1,constvoid*p2){POINT*p3,*p4;doublem;p3=(POINT*)p1;p4=(POINT*)p2;m=Multiply(a[0],*p3,*p4);if(m0)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--;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;in;i++)scanf(%lf%lf,&a[i].x,&a[i].y);if(n==1){printf(0.00\n);continue;}elseif(n==2){printf(%.2lf\n,Distance(a[0],a[1]));continue;}py=-1;for(i=0;in;i++){if(py==-1||a[i].ypy){px=a[i].x;py=a[i].y;p=i;}elseif(a[i].y==py&&a[i].xpx){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)*2,Compare);a[n].x=a[0].x;a[n].y=a[0].y;Tubao();len=0.0;for(i=0;itop;i++)len=len+Distance(result[i],result[i+1]);printf(%.2lf\n,len);}return0;}2020/4/1569AnyQuestion?2020/4/1570相关练习题:1086YoucanSolveaGeometryProblemtoo1115LiftingtheStone2036改革春风吹满地1348、1392Zoj:1450、15412020/4/1571Seeyounextweek.Thankyou!