求凸包算法详解
凸包convexhullppt课件

Graham模版(水平序) by 吉林大学:
凸包问题:
凸包问题一般有以下两类: 1.求凸包面积周长 2.求平面最远点对
凸包面积周长 我们先来看一个问题,POJ 1113。 题意:有个贪心的国王叫他的建筑师给他的城堡周围建个围墙,他要求用最少的石
头和劳动力来建造,而且要在距离城堡某个距离L之外建造。 解法:
旋转卡壳的应用
旋转卡壳主要是用来求点集中最远点对的。如POJ 2187,就是一道求最远 点对的裸题。学会了旋转卡壳用模版可以直接过。具体参照code。
POJ 3608,求两个凸包间的最短距离。 个人解法:先求出两个凸包,然后对其中一个凸包的左下方的基准点,对
另外一个凸包求最小对应边。然后再从另外一个凸包的左下方的基准点,对前个凸
怎么从给定的点中找凸包呢?
1.卷包裹算法
2. Graham扫描算法
卷包裹算法
可以说是一个很朴素的算法,其时间复杂度最坏情况为O(n^2),其实现原理非常简 单。就像是拿了一根绳子,以最左下方的点开始,围着所有点的外围围了一圈。
先找到横坐标最小的点中纵坐标最小的点,然后以该点作为基准点,对剩余的所有
旋转卡壳算法: 这是一个非常优美而高效的算法(演示图如下):
旋转卡壳算法是解决一些与凸包有关问题的有效算法 就像一对卡壳卡住凸包 旋转而得名。被一对卡壳正好卡住的对应点对称为对踵点(Antipodal point),可以证明对 踵点的个数不超过3N/2个 也就是说对踵点的个数是O(N)的,对踵点的个数也是解决问 题的时间复杂度的保证。
while(fabs(cross(res[p+1],res[p],res[q+1]))>fabs(cross(res[p+1],res[p],res[q]))) q=(q+1)%n;
凸包算法公式

凸包算法公式凸包是计算几何中的一个重要概念,而凸包算法公式则是解决相关问题的关键工具。
咱先来说说啥是凸包。
想象一下,你面前有一堆散落在地上的钉子,然后你拿一个橡皮筋把最外层的钉子圈起来,让橡皮筋形成的形状能够完全包住所有钉子,这个形状就是这堆钉子的凸包。
凸包算法有好几种,比如 Graham 扫描法、Jarvis 步进法等等。
咱就拿 Graham 扫描法来说说它涉及的公式。
Graham 扫描法里,首先要找到一个基准点。
通常找纵坐标最小的点,如果有多个这样的点,就选横坐标最小的那个。
找到这个点后,其他点就按照和这个基准点的极角大小进行排序。
这里就涉及到计算极角的公式啦。
对于两个点 A(x1, y1)和 B(x2, y2),极角θ 可以通过反正切函数来计算,公式是:θ = atan2(y2 - y1, x2 - x1)。
计算出极角后,就可以开始扫描了。
从基准点开始,依次检查相邻的三个点,如果这三个点构成的转向是逆时针的,那就保留中间那个点;如果是顺时针的,就把中间那个点去掉。
这里判断转向的公式就比较关键了。
对于三个点 A(x1, y1)、B(x2,y2)和 C(x3, y3),可以通过计算向量叉积来判断转向。
如果叉积大于 0 ,就是逆时针;小于 0 ,就是顺时针。
向量叉积的公式是:(x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1) 。
我记得之前有一次参加数学建模比赛,题目就和凸包算法有关。
当时我们小组几个人,一开始对这些公式和算法都不太熟悉,急得像热锅上的蚂蚁。
大家一起熬夜查资料、讨论,一遍遍地推导公式,尝试不同的方法。
特别是在计算极角和判断转向的时候,总是出错。
但经过不断地尝试和纠错,我们终于搞清楚了这些公式的应用,成功解决了问题,还拿到了不错的名次。
总之,凸包算法公式虽然看起来有点复杂,但只要掌握了其中的原理和规律,多做练习,就能熟练运用啦。
不管是在数学研究中,还是在实际的计算机图形学、地理信息系统等领域,凸包算法都有着广泛的应用。
凸包算法

长 江 大 学 地 球 科 学 学 院
遗留有一个问题 就是处理共线的问题 有时候我们需要凸包边上的点也考虑到 有时候却需要去掉这些点 我们通常称在凸包顶点处的点为极点 如果我们只要求保留极点而去除在边上的点 我们只需在取外侧的点的时候 碰到共线的点取最远的 相反 如果我们要保留所有在边上的点我们只需要在共线的点中取最近的 同样由于参考点的性质 所有向量之间的到角都是在180度以内 不会产生错误
我们经常关注一个点集的凸包 这也是计算几何学的一个基本问题,现在 已经有成熟的算法可以求出平面点集的凸包,凸包有着优美而实用的 性质 我们可以利用凸包把一个杂乱的点集所包含的信息进行有效的 概括、梳理。
2 Graham扫描算法(Graham Scan Algorithm)
Graham扫描算法维护一个凸壳 通过不断在凸壳中加入新的点和去除影响 凸性的点 最后形成凸包 算法主体由两部分组成 先是排序 后是扫描 分块讲解一下
void Graham(int n) { int i,top=2; Pt[n]=Pt[0]; Stack[0]=Pt[0]; Stack[1]=Pt[1]; Stack[2]=Pt[2]; for(i=3;i<=n;i++) { while(Cross(Stack[top1],Stack[top],Pt[i])<=0&&top>1) top--; Stack[++top]=Pt[i]; } }
有了向量 我们就可以选取一个最外侧的点了
长 江 大 学 地 球 科 学 学 院
利用向量 我们可以比较哪个点"更外侧" 比如点K和点I 我们利用向量JK乘以向量JI得到一个数 这 个数应该是负数 说明I比K更外侧 两个向量的比较具有传递性 所以我们可以像N个数里取 最大的数一样取出最外侧的 遍历所有点 每个点都和现有最外侧的点比较 得到新的最 外侧的点
凸包及最小外围矩形

题目简述:給出一个平面点集S,求一个面积最小的矩形使其包含S所有的点。
预备知识:在求解这道题之前我们先要了解一些关于凸包的知识。
什么是凸包?简单地说,对于一个平面点集S,我们把完全包含该点集的最小的凸多边形叫做点集S的凸包H。
凸包一个很重要的性质就是它“凸”的性质。
这个性质对我们理解和计算凸包都有很大的帮助。
I)对点集S中任意一点a,当且仅当存在直线p过a点并使得S中除a外所有点均在p的一侧,则a为凸包上的一顶点。
II)对点集S中任意两点a,b,当且仅当S中除a,b以外所有点都在过点a,b 的直线p的一侧,则线段ab为凸包上的一条边。
III)对点集S中任意四点a,b,c,d,当d在三角形a bc中(包括边),则d不是凸包上的点。
上面的几条关于凸包“凸”的性质为我们计算凸包提供了一个基础。
这里我们将介绍两种简单且被广泛运用的算法――Gift-Wrappin g和Grah am-Scan算法。
Gift-Wrappin g算法:通过性质(I),我们可以找到一个特殊点,如具有最小y坐标且x坐标尽可能小的点。
将它作为计算凸包的第一个顶点。
确定了起点后,我们就可以通过Gift-Wrappin g算法计算出点集的凸包。
下面的步骤很直观的描述了这个算法:1)把点集中所有点都看成是固定在平面上的柱子,想象我们在起始点柱子上系上一根身子。
2)把绳子沿水平方向向右拉直,并逆时针旋转,当绳子碰上一根柱子,则对应了凸包上的一点3)继续旋转绳子,每次确定一个凸包上的顶点,直至绳子回到起点。
图一:Gift-Wrappin g算法计算凸包的过程每次通过旋转绳子找到下一个凸包顶点需要对点集中所有剩余点进行一次比较,所以这一步的时间复杂度是O(n)。
每个凸包上的顶点都需要进行一次旋转操作,而最坏情况下,凸包顶点个数可以和点集个数相等,所以整个Gif t-Wrappin g算法的时间复杂度是O(n2)的。
凸包面积和周长的计算

凸包面积和周长的计算凸包是在平面上给定的一组点中构成的最小凸多边形。
凸包的面积和周长是计算凸包重要的指标,可以用来分析数据分布的紧密程度和形状特征。
本文将介绍凸包的定义和生成算法,并详细说明如何计算凸包的面积和周长。
一、凸包的定义凸包是指在平面上给定的一组点中,由这些点构成的最小凸多边形。
凸多边形的特点是:任意两点之间的线段都在多边形内部。
凸包是凸多边形中的最小面积的凸多边形,即是在所有凸多边形中,面积最小的凸多边形。
二、凸包的生成算法1. Jarvis算法(也叫作包裹算法或者旋转卡壳算法):该算法基于以下思想:从一组点中找到一个起始点,将其作为凸包的一个顶点。
然后,从这个点开始,寻找下一个能保证凸包深度最大的点,并将其加入凸包。
不断重复这个过程,直到回到起始点为止。
该算法的时间复杂度为O(nh),其中n是点的个数,h是凸包的顶点数。
2.快速凸包算法:该算法基于Graham扫描算法改进而来。
首先选择一个y坐标最小的点,将其他点按照与这个点的连线的极角进行排序。
然后依次处理排序后的点,对每个点进行判断,如果点在逆时针方向上,则加入凸包,否则舍弃。
最后得到凸包。
该算法的时间复杂度为O(nlogn),是一种高效的凸包生成算法。
三、凸包面积的计算凸包的面积可以用以下公式进行计算:S = (x1y2 + x2y3 + ... + xn-1yn + xny1 - x2y1 - x3y2 - ... - xnyn-1 - x1yn) / 2其中,(x1, y1), (x2, y2), ..., (xn, yn)是凸包的顶点的坐标。
计算凸包的面积可以通过以上公式进行求解,公式中的坐标是有顺序的,要按照逆时针或者顺时针的方向依次输入。
四、凸包周长的计算凸包的周长可以通过计算凸包顶点之间的距离之和来得到。
对于凸包的n个顶点,可以依次计算相邻顶点之间的距离,并将其累加得到凸包的周长。
保证计算的正确性需要注意以下几点:1.凸包的顶点要按照逆时针或者顺时针的方向依次输入,以保证计算出的面积和周长的结果正确。
第65讲凸集与凸包(原)

第65讲凸集与凸包(原)第65讲凸集与凸包本节主要内容是:凸集、凸包的概念以及⽤凸集凸包来解有关的题.凸集:平⾯上的点集,如果任何两点在这个点集内,则连这两点的线段上的所有的点也在此点集内,就说该点集是⼀个凸集.线段、射线、直线、圆及带形、整个平⾯等都是凸集.两个凸集的交集还是凸集;任意多个凸集的交集也仍是凸集.凸包:每个平⾯点集都可⽤凸集去盖住它,所有盖住某个平⾯点集的凸集的交集就是这个平⾯点集的凸包.或者可以形象地说:如果把平⾯上的点集的每个点都插上⼀根针,然后⽤⼀根橡⽪筋套在这些针外,当橡⽪筋收紧时橡⽪筋围出的图形就是这个点集的凸包.平⾯点集的直径平⾯点集中的任意两点距离的最⼤值称为这个平⾯点集的直径.例如,圆的直径就是其直径,有⽆数条;线段的直径就是其本⾝;正三⾓形的三个顶点组成的点集的直径就是其边长,有三条;平⾏四边形的直径是其较长的对⾓线;….A类例题例1定理任何⼀个平⾯点集的凸包是存在且唯⼀的.分析存在惟⼀性的证明,即证明满⾜某条件的集A存在且惟⼀存在.通常先证明存在性,即证明有满⾜条件的集合A.再⽤反证法证明惟⼀性,即若满⾜条件的集A不惟⼀,或说明会引出⽭盾,或得出其余集均必需与A相等的结论.证明由于全平⾯是⼀个凸集,故任何平⾯点集都可⽤全平⾯盖住,即能被凸集盖住,从⽽盖住该凸集的所有凸集的交集存在,即凸包存在.⽽如果某个凸集A有两个凸包M1与M2,则M1∩M2也能盖住凸集A,且M1∩M2?M1,但M1是A的凸包,故M1? M1∩M2,故M1∩M2=M1.同理M1∩M2=M2.即M1=M2.例2 定理如果⼀个点集M 是由有限个点组成,且其中⾄少有三个点不共线,则M 的凸包是⼀个凸多边形.分析可以构造⼀个寻找凸包的⽅法,来说明命题的正确性.证明由于M 为有限点集,故存在⼀条直线l ,使M 中的⼀个或⼏个点在l 上,其余的点都在l 同旁(这只要任画⼀条直线,如果点集M中的点在直线l 的两旁,则让直线按与此直线垂直的⽅向平移,即可得到满⾜要求的直线).取l 上的两个⽅向中的⼀个⽅向为正向,此时,按此正向,不妨设M 中不在l 上的点都在l 的左边.在l 上沿其正向找出M 中的最后⼀个点A 1,把l 绕A 1逆时针旋转,直到遇到M 中的另外的点,⼜找出此时l 上的M 中的最后⼀个点A 2,此时再让l 绕A 2逆时针旋转,依此类推,直到最后绕A k 旋转⼜遇到A 1为⽌(由于M 是有限点集,故这样的旋转不可能⼀起下去).这时,凸多边形A 1A 2…A k 即为M 的凸包.情景再现1.证明圆⾯(圆及圆内所有的点组成的集合)是凸集.2.平⾯上任意给定5个点,其中任三点不共线,则可选出4个点,这四点能构成⼀个凸四边形的四个顶点. B 类例题例3 海莱定理:定理(海莱定理) 对于若⼲个(个数n ≥3)凸集,如果任意三个凸集都有⼀个公共点,那么存在⼀个点同时属于每个凸集.分析先证明简单情况,再⽤数学归纳法证明本定理.证明对于n =3,显然成⽴.当n >3时,先取4个这样的凸集.F 1,F 2,F 3,F 4.A A A A 123k l l 1设点P 1∈F 2∩F 3∩F 4,点P 2∈F 1∩F 3∩F 4,点P 3∈F 1∩F 2∩F 4,点P 4∈F 1∩F 2∩F 3.若P 1、P 2、P 3、P 4中有两个点重合,例如P 1=P 2,则P 1∈F 1∩F 2∩F 3∩F 4;设此四点互不相同.⑴若此四点中有三点共线,例如P 1、P 2、P 3共线,且P 2在P 1、P 3之间,则P 2∈F 1∩F 2∩F 3∩F 4;⑵若此四点中⽆三点共线,由上可知ΔP 1P 2P 3?F 4,ΔP 1P 2P 4?F 3,ΔP 1P 3P 4?F 2,ΔP 2P 3P 4?F 1,此时,①若P 1、P 2、P 3、P 4的凸包为凸四边形,则此凸四边形对⾓线交点K ∈此四个三⾓形;②若P 1、P 2、P 3、P 4的凸包为三⾓形,例如凸包为ΔP 1P 2P 3,则P 4∈此四个三⾓形.总之,存在点K ∈F 1∩F 2∩F 3∩F 4.即对于n =4定理成⽴.当n >4时,易⽤数学归纳法证明.说明请读者完成⽤数学归纳法证明⼀般情况.例4平⾯上任给5个点,以λ表⽰这些点间最⼤的距离与最⼩的距离之⽐,证明:λ≥2sin54?.(1985年全国联赛)分析这类问题总是先作出凸包,再根据凸包的形状分类证明.这样分类证明问题可以使每⼀类的解决都不困难,从⽽使问题得到解决.证明⑴若此五点中有三点共线,例如A 、B 、C 三点共线,不妨设B 在A 、C 之间,则AB 与BC 必有⼀较⼤者.不妨设AB ≥BC .则AC BC≥2>2sin54?.⑵设此五点中⽆三点共线的情况.A CC B DEC B ADE A①若此五点的凸包为正五边形.则其五个内⾓都=108?.五点的连线只有两种长度:正五边形的边长与对⾓线,⽽此对⾓线与边长之⽐为2sin54?.②若此五点的凸包为凸五边形.则其五个内⾓中⾄少有⼀个内⾓≥108?.设∠EAB ≥108?,且EA ≥AB ,则∠AEB ≤36?,∴BE AB =sin(B +E )sin E ≥sin2E sin E=2cos E ≥2cos36?=2sin54?.③若此五点的凸包为凸四边形ABCD ,点E 在其内部,连AC ,设点E 在△ABC 内部,则∠AEB 、∠BEC 、∠CEA 中⾄少有⼀个⾓≥120?>108?,由上证可知,结论成⽴.④若此五点的凸包为三⾓形ABC ,则形内有两点D 、E ,则∠ADB 、∠BDC 、∠CDA 中必有⼀个⾓≥120?,结论成⽴.链接海尔布朗(Heilbron )问题:设平⾯上给定n 个点,每两点间距离的最⼤值与最⼩值的⽐为λn ,求λn 的下确界.现在得到的结论有:λ4≥2;λ5≥2sin54?;λ6≥2cosπ10.λ7≥2,λ8≥sin 3π7sin π7,猜测λn ≥2cos πn .例5 每个有界平⾯点集,都有且只有⼀个盖住它的最⼩圆.如果这个集合是凸集,那么在这个圆上或者有此凸集的两个点,这两点是此圆的⼀条直径的两个端点;或者有此集的三个点,此三点为顶点的三⾓形是锐⾓三⾓形.分析由于“有界平⾯点集”这⼀概念涉及点集⼴泛,所以要就⼀般情况来讨论.但仍可采取从简单到复杂的办法,先解决简单的情况,以此为基础再解决⼀般情况.证明⾸先,若M 是平⾯有界点集,故可以作⼀个半径⾜够⼤的圆把它盖住.在所有盖住M 的圆中有且只有1个最⼩圆,如果有两个最⼩圆⊙O 1、⊙O 2盖住M (显然这两个圆半径应该相等),此⼆圆不重合,且都盖住了M ,于是其公共部分也盖住了M .以此⼆圆的公共弦为直径作圆O ,则此圆盖住了两圆的公共部分,于是也盖住了M ,但此圆⽐⊙O 1、⊙O 2⼩.现证明此结论的后⾯部分:1? ⾸先,盖住有界凸集M 的最⼩圆与M 如果没有公共点(图1),保持圆⼼O 不动,缩⼩其半径,直到与M 有公共点为⽌,此时,盖住M 的圆半径的半径变⼩.2? 如果盖住M 的圆与M 只有唯⼀的公共点(图2),则沿半径⽅向稍移动圆,⼜得1? 3? 如果M 上有两个点A 、B 在圆上,这两点不是同⼀条直径的端点,且优弧⌒AB 上没有圆上的点,则沿与AB 垂直的⽅向移动圆即可得到1?.例6设G 是凸集,其⾯积⽤g 表⽰,且其边界不包括直线段与尖点(即过其边界上每⼀点都有⼀条切线且每条切线与G 的边界只有⼀个公共点).设PQRS 是G 的外切四边形中⾯积最⼩的⼀个,A ,B ,C ,D 分别是它的四条边与G 的边界的切点.则ABCD 是⾯积⼤于g 2的平⾏四边形.分析利⽤微调来说明本题.证明先证明⼀个引理:若A 是PQ上的切点,则A 为PQ 的中点.反设A 不是PQ 的中点,不妨设AP >AQ ,现把点A 向P 微移到A ',切线⑴⑵⑶B A P S A C D Q'P'A'OPQ移动为P'Q'(如图),只要A'⾜够靠近A,就仍有A'P'>A'Q'.设PQ、P'Q'交于点O,则O、A、A'三点充分靠近.∴OP'>OQ',OP>OQ.于是SΔOPP>SΔOQQ'.此时S P'Q'RS=S PQRS+SΔOQQ'-SΔOPP'<S PQRS,即得出⽐PQRS⾯积还要⼩的外切四边形.与PQRS最⼩的假设⽭盾.于是得A为PQ中点.同理B、C、D分别为相应边的中点.因顺次连结四边形各边中点得到的是平⾏四边形.即ABCD是平⾏四边形.⽽S PQRS>g,所以S ABCD=12S PQRS>12g.说明本题的证明含有连续与极限的思想.情景再现3.在平⾯上有n(n≥4)个点组成的点集M,如果任取其中4个点都是凸四边形的四个顶点,则此n个点是⼀个凸n边形的顶点.4.平⾯上任意给出6个点,其中任意三点不在⼀条直线上,证明:在这6个点中,可以找到3个点,使这3个点为顶点的三⾓形有⼀个⾓不⼩于120 .5.在由n(n≥3)个点组成的点集M中,如果有⼀个点⾄少是三条直径的端点,则M中必有⼀点⾄多是⼀条直径的端点.6.是否任意⼀个凸四边形都可⽤折线分成两部分,使每部分的直径都⼩于原四边形的直径?C类例题例7设A、B是平⾯上两个有限点集,⽆公共元素,且A∪B中任意三点都不共线,如果A、B中⾄少有⼀者的点数不少于5个,证明存在⼀个三⾓形,它的顶点全在A中或全在B中,它的内部没有另⼀个集合中的点.(IMO —25预选题)分析抓住5点组来讨论.证明设集合A 中的点不⼩于5个,从中选出5个点A 1、A 2、A 3、A 4、A 5,使这5点的凸包内没有其他A 的点,否则可⽤其内部的点来代替原来的某些点.⑴若此凸包为五边形,取△A 1A 2A 3、△A 1A 3A 4、△A 1A 4A 5,若这三个三⾓形中的任何⼀个内部⽆集合B 中的点,则此三⾓形即为所求,若此三个三⾓形内都有B 中的点则在每个三⾓形内取⼀个B 中的点,这三点连成的三⾓形内部没有A 中的点.⑵若此凸包为四边形A 1A 2A 3A 4,内部有⼀个点A 5,则可连得4个三⾓形:△A 5A 1A 2、△A 5A 2A 3、△A 5A 3A 4、△A 5A 4A 1,若任⼀个内部没有B 中的点,则此三⾓形即为所求,若每个三⾓形内部都有B 中的点,则每个三⾓形内取⼀个B 中的点,连成两个互不重叠的三⾓形,其中⾄少有⼀个三⾓形内部没有A 中的点,即为所求.⑶若此凸包为三⾓形,内部有两个点,则可把凸包分成5个三⾓形,如果每个三⾓形内都有B 中的点则5个点分布在直线A 4A 5两侧,必有⼀侧有其中三个点,这三点连成的三⾓形内就没有A 中的点.说明题中有“不少于5点”的条件,所以就只要研究5个点的情况.例8平⾯上任给5个点,其中任3点不共线,则在以这些点为顶点的三⾓形中,⾄多有7个锐⾓三⾓形.证明 5个点中任取3个点为顶点的三⾓形共有10个.⑴若这5点的凸包为凸五边形,这个五边形⾄少有两个⾓⾮锐⾓(因五边形内⾓和为540?,若五边形的内⾓中有4个锐⾓,则此4个⾓的和≤360?,于是另⼀个⾓≥180?).这两个⾮锐⾓相邻或不相邻.①若两个⾮锐⾓相邻,如图中A 、B ⾮锐⾓,连BE ,则四边形BCDE A A A A 1234523123415A A A A A A B B B⾄少有⼀个⾓⾮锐⾓,于是图中⾄少有3个⾓⾮锐⾓,即⾄少有三个⾮锐⾓三⾓形.从⽽⾄多有7个锐⾓三⾓形.②若两个⾮锐⾓不相邻,如图中A 、C ⾮锐⾓,则ΔEAB 、ΔBCD ⾮锐⾓三⾓形.连AC ,则四边形ACDE 中⾄少有⼀个⾮锐⾓,于是图中⾄少有三个⾮锐⾓三⾓形,即⾄多有7个锐⾓三⾓形.⑵若这个凸包为四边形ABCD ,E 在形内.则四边形ABCD ⾄少有⼀个内⾓⾮锐⾓,∠AEB 、∠BEC 、∠CED 、∠EDA 中⾄少有⼀个⾮锐⾓(否则四个⾓的和少于360?),∠AEC 、∠BED 中⾄少有⼀个⾮锐⾓(否则∠BEC >180?),于是图中⾄多有7个锐⾓三⾓形,⑶若凸包为三⾓形ABC ,D 、E 在形内,则∠ADB 、∠BDC 、∠CDA 中⾄多有⼀个锐⾓,∠AEB 、∠BEC 、∠CEA 中⾄多有⼀个锐⾓,即图中⾄多有6个锐⾓三⾓形.综上可知,结论成⽴.说明利⽤五点组的特点解决问题.本题即是下⾯情景再现第7题的引理.情景再现7.平⾯上任给100个点,其中任3点不共线,则在以这些点为顶点的三⾓形中,⾄多有70%的三⾓形是锐⾓三⾓形.(IMO —12—6)8.设G 是凸集,其⾯积⽤g 表⽰,且其边界不包括直线段与尖点(即过其边界上每⼀点都有⼀条切线且每条切线与G 的边界只有⼀个公共点).ABCD 是G 的所有内接四边形中⾯积最⼤的⼀个,过A ,B ,C ,D 作G 的切线得到四边形PQRS .证明:PQRS 是G 的⾯积⼩于2g 的外切平⾏四边形.C B A DE C B A D EA习题651.⑴证明:平⾯点集M的直径等于它的凸包M'的直径.⑵由n(3≤n<+∞)个点组成的平⾯点集共有k条直径,证明k≤n.2.证明:⼀个平⾯凸集的直径如果不⽌⼀条则任何两条直径都相交,3.在平⾯上给出n个点,它们中的任意三点都能被⼀个半径为1的圆盖住,证明:这n个点能被半径为1的圆盖住.4.平⾯点集M的对称轴的并集为L,L的对称轴的并集为S,求证:L S.5.平⾯上五点,⽆三点共线,每三点连出⼀个三⾓形,最多可以连出多少个钝⾓三⾓形?最少可以连出多少个钝⾓三⾓形?6.平⾯上任给4个点,这四点连成的线段中最长与最短的线段的长度⽐≥2.7.给定n个点⽆三点共线,每三个点为顶点组成⼀个三⾓形,每个三⾓形都有⼀个⾯积,令最⼤⾯积与最⼩⾯积的⽐为µn,证明:µ4≥1;µ5≥5+12.(还可证µ6≥3,但µ7也没有解决)8.包含平⾯点集S的最⼩圆的半径⽤符号r(S)表⽰.如果点A、B、C之间的距离⼩于点A'、B'、C'之间的相应距离,那么,r(A、B、C)<r(A'、B'、C').本节“情景再现”解答:1.证明任取⼀个圆⊙O,其半径=r>0,在圆⾯上任取两点A,B,则OA≤r,OB≤r.作OC⊥AB于C,对于AB上任意⼀点D,则D必⾄少与A、B之⼀在C的同侧,设D与A在C的同侧,则OD<OA≤r,故D在⊙O内部.故圆⾯为凸集.2.证明⑴若此五点的凸包为五边形,则可去掉⼀点,余下四点即是⼀个凸四边形的四个顶点.⑵若此凸包为四边形,则凸包即为所求;OABCD⑶若此凸包为三⾓形,设为△ABC ,于是形内有两点,设为P 、Q ,直线PQ 把平⾯分成两部分,A 、B 、C 三点在此两部分内,故必有⼀部分中有其中两点,例如B 、C 在PQ 同侧,则P 、Q 、B 、C 即为所求的四点.3.证明这n 个点的凸包是⼀个凸多边形ABCD …,由例2知,此凸多边形的每个顶点都是M 中的点.设M 中某点(设为P )不是此多边形的顶点,则P 在凸包多边形的内部或边上.连凸包多边形的所有过A的对⾓线,把凸包多边形分成若⼲个三⾓形,于是P 必在某个三⾓形内部或边上,设在ΔABCD 内部或边上,则A 、B 、C 、P 四点就不是凸四边形的顶点,⽭盾.故证.4.证明⑴若这6点的凸包为三⾓形ABC ,形内有三点D 、E 、F ,则∠ADB 、∠BDC 、∠CDA 中⾄少有⼀个⾓≥120?,设∠ADB ≥120?,则△ADB 即为满⾜要求的三⾓形.⑵若这6点的凸包为四边形ABCD ,形内有两点E 、F ,连AC 把四边形分成两个三⾓形,则⾄少有⼀个三⾓形内有⼀点,例如△ABC 内有⼀点E ,则据上证可知结论成⽴;⑶若这6点的凸包为五边形ABCDE ,F 为形内⼀点,则∠AFC +∠CFE +∠EFB +∠BFD +∠DF A =360?×2=720?,从⽽这5个⾓中必有⼀个⾓≥720?5=144?>120?.(也可连AC 、AD 把五边形分成三个三⾓形来证) ⑷若这6个点的凸包为六边形,由于六边形的内⾓和为4×180?=720?,故⾄少有⼀个内⾓≥720?6=120?. 5.证明设M 的直径为d ,且AB 、AC 、AD 是三条直径,且AB 在∠CAD 内部.分别以A 、B 为圆⼼d 为半径作圆则M必在⼆圆的公共部分B AC B AD FE C BAQ P中,如果从点B 还能引出⼀条直径BE (E ≠A ),不妨设E 与C 在AB 的同侧,于是四边形ADBE 为凸四边形,从⽽AB +DE >AD +BE .得DE >d .这与直径定义⽭盾.6.解:设凸四边形ABCD 中,?ABC 为正三⾓形,边长为d .点D 到A 、B 、C 的距离都<AB ,则此四边形有三条直径.⼀条折线⽆论把ABCD 分成怎样的两部分,A 、B 、D 三点中总有两点在同⼀部分.于是这⼀部分的直径仍为d . 7.解 100个点中,共可组成C 3 100 个三⾓形,每次取5个点共有C 5 100 个五点组.每个五点组中都⾄多有7个锐⾓三⾓形.⽽每个三⾓形都在C 2 97 个五点组中,因此,锐⾓三⾓形⾄多7C 5 100C 2 97个,故锐⾓三⾓形⾄多占7C 5 100C 2 97·C 3 100=70%. 8.证明根据以下⼀个显然的事实:A 、B 为G 的弧上两个定点,C 为弧上⼀动点,当G 的在点C 处的切线MN ∥AB 时,ΔABC 的⾯积取得最⼤值.设ABCD 是凸集G 的内接四边形中⾯积最⼤者.连AC ,固定A 、C ,则当且仅当点B 处的切线平⾏于AC 时ΔACB 的⾯积最⼤.于是知当且仅当B 、D 处的切线都平⾏于AC 时ABCD 的⾯积才能最⼤,同理连BD ,仍有A 、C 处的切线平⾏于BD时,ABCD 的⾯积最⼤,即PQRS 是平⾏四边形.∵S PQRS =2S ABCD <2g .“习题67”解答:1.⑴证明:M '的直径为d ',⽽M 的直径为d .设A 、B 是M 中距离等于d 的两个点.∵ M '盖住M ,由于M ?M ',故A 、B ∈M '.于是d '≥d ;⼜若d '>d ,即凸包上有两点A '、B ',使A 'B '>d ,于是必存在点C '∈A 'B ',C B AD E M N A B C使A'C'上没有M的点.于是可以⽤更⼩的凸集盖住M,与凸包定义⽭盾.⑵证明:n=3时,3个点的点集最多连出3条线段,即⾄多有3条直径,⽽正三⾓形的三个顶点所成的集合恰有3条直径.即k≤n 成⽴.设有n-1个点的点集的直径数≤n-1.对于n个点的点集,若点集中的每个点引出的直径数≤2,则直径数≤2n÷2=n.若有某点引出的直径数≥3,则必有⼀点,该点引出的直径数为1.去掉此点,则由归纳假设,余下n-1点的直径数≤n-1,故原来的直径数≤n.故证.2.证明:设AB、CD是平⾯凸集的两条不相交的直径.则A、B、C、D的凸包为线段,这不可能.A、B、C、D的凸包若为三⾓形ABC,D在?ABC内,有BD<max{BC、BA}≤AB.⽭盾.若A、B、C、D的凸包为四边形ABCD,则AC+BD>AB+CD,于是AC、BD中⾄少有⼀个>AB,与AB为直径⽭盾.3.证明:n=3时命题显然成⽴,对于n=4.⊙O1、⊙O2、⊙O3、⊙O4的半径都为r,⊙O1盖住P2、P3、P4;⊙O2盖住P1、P3、P4;⊙O3盖住P1、P2、P4;⊙O4盖住P1、P2、P3.现以P1、P2、P3、P4为圆⼼,作半径为r的圆.于是O1在⊙P2、⊙P3、⊙P4内,从⽽⊙P2、⊙P3、⊙P4有公共点,由此可知,⊙P1、⊙P2、⊙P3、⊙P4中任意三个都有公共点,由海莱定理,为四个圆有⼀个公共点.设此点为Q,由于点Q在四个圆内,故Q到P1、P2、P3、P4的距离都不超过r,从⽽以Q为圆⼼,r为半径作圆可把P1、P2、P3、P4盖住.以上证明对于n个点也成⽴.4.证明:若凸集F只有1条对称轴l,则l?L,但l也是⾃⼰的对称轴,故l?S.于是L?S.若F的对称轴不只1条,任取其⼀条对称轴l1,则l1?L,只要证明l1?S即可.31l2l31P3 P2即只要证明对于F 的任⼀对称轴l 2,其对称直线l 3也是F 的对称轴.取F 的任⼀点P ,P ∈F ,由于l 1是F 的对称轴,则P 关于l 1的对称点P 1∈F .同理,P 1关于l 2的对称点P 2∈F ,P 2关于l 1的对称点 P 3∈F .但P 3与P 关于l 3对称.即l 3是F 的对称轴.故证.5.解:最多可以连出10个钝⾓三⾓形(如图,以AB 为直径作半圆⾯,内取⼀点C ,以BC 、AC 为直径作半圆⾯,三个半圆⾯的交的内部取点E ,以BE 、AE 为直径作半圆,五个半圆⾯的交内取点D ,则10个三⾓形都是钝⾓三⾓形.例中已证⾄少3个钝⾓三⾓形.(如图可画出只有3个钝⾓三⾓形的情况).6.证明设所求⽐为λ.⑴如果其中有三点共线,例如A 、B 、C 三点共线,不妨设B 在A 、C 之间,则AB 与BC 必有⼀较⼤者.不妨设AB ≥BC .则λ≥AC BC≥2>2.⑵如果此四点中⽆三点共线,则此四点的凸包为四边形或三⾓形.①若此凸包为三⾓形,凸包三⾓形是直⾓三⾓形,三边满⾜a ≤b <c .则c 2=a 2+b 2≥2a 2,从⽽λ≥c a≥2.凸包三⾓形是钝⾓三⾓形,三边满⾜a ≤b <c ,则c 2=b 2+a 2-A D E CB ACC B cb a A C Bc b a C BA D j EDC B A2ab cos C >b 2+a 2≥2a 2,得λ≥c a≥2.凸包三⾓形是锐⾓三⾓形ABC ,则形内有⼀点D ,则△DAB 、△DBC 、△DCA 中,∠ADB +∠BDC +∠CDA =360?,故此三⾓不可能都≤90?,否则此三⾓之和≤270?,⽭盾.即此三个三⾓形中⾄少有⼀个是钝⾓三⾓形.由上证知,结论成⽴.②若此四点的凸包为四边形,ABCD ,则∠ABC 、∠BCD 、∠CDA 、∠DAB 不可能都是锐⾓.即⾄少有⼀个⾓⾮锐.设∠ABC ≥90?,则由上证知,结论成⽴.⑶当此四点的凸包为正⽅形时,显然有λ=2.综上可知λ≥2成⽴.7.解:正⽅形的µ4=1,其余的情况µ4>4.对于5点问题,若凸包为三⾓形ABC ,取形内的⼀点D ,则?DAB 、?DBC 、?DCA 中必有⼀个≤?ABC 的⾯积的13.于是所求⽐≥3>5+12.凸包为四边形同此.若凸包为五边形ABCDE ,取⾯积最⼩的三⾓形,则必有两边为五边形的两边(若只有⼀边,可知此五边形为凹),设⾯积最⼩的三⾓形为?ABE .AB 、AE为边.则其余两顶点在∠EAB 内部,⼜作BM ∥AE ,EN ∥AB ,交于K ,则其余两个顶点在∠MKN 内部或边上(?ABE ⾯积最⼩)先研究两个顶点在边上的情况,若点C '、D 在⾓的边上,其中D 与BE 距离较⼩,作D'C∥BE ,交KN 于C ,则点C 所得的⾯积⽐不超过C '所得的⾯积⽐.?CDB 、?CDE ⾯积≥?ABE ⾯积,类似构造五条对⾓线都分别与不相邻的边平⾏的五边形,不妨设S ?ABE =1,则S ?ABC =S ?BCD =S ?CDEFA B C D E=S ?DEA =S ?ACF =1,设S ⊿AEF =x ,则S ⊿DEF =1-x .S ?CDF =x ,于是EF FC =1-x x.但S ?AEF S ?ACF =EF FC,即 x 1 = 1-x x .于是得 x 2 +x -1=0.解得满⾜题意的根为 x =5-12.于是S ?AEC S ?ABE =5+12.此五边形的µ5=5+12.对于C 、D 不在∠MKN 边上的情况,可转化为以上情况.8.证明: 1? 若ΔABC 是⾮锐⾓三⾓形,则r (A 、B 、C )=max{AB 2,BC 2,CA 2}≤max{A 'B '2,B 'C '2,C 'A '2}≤r (A ',B ',C '}.(盖住ΔABC 的最⼩圆是以最长边为直径的圆,⽽ΔA 'B 'C '可能为锐⾓三⾓形,也可能是钝⾓三⾓形或直⾓三⾓形)2? 若ΔABC 与ΔA 'B 'C '都是⾮钝⾓三⾓形,盖住它们的最⼩圆都是其外接圆.于是必存在⼀对⾓(例如∠A 与∠A '),满⾜90?≥∠A ≥∠A ',若不存在这样的⼀对⾓,则∠A <∠A ',∠B <∠B ',∠C <∠C ',与三⾓形内⾓和定理⽭盾.于是r (A ,B ,C )=BC 2sin A <B 'C '2sin A '=r (A ',B ',C '). 3?若ΔABC 是锐⾓三⾓形,ΔA 'B 'C '⾮锐⾓三⾓形.不妨设∠C '≥90?,现作⼀个辅助ΔA 'B "C ',使C 'B "=C 'B ',∠A 'C 'B "=90?,则r (A ',B ",C ')=A 'B "2A'B'B"≤A'B'2=r(A',B',C').∵ΔABC是锐⾓三⾓形,∴AB2<AC2+CB2<A'C'2+C'B'2=A'C'2+C'B"2=A'B"2.即AB<A'B".但ΔABC与ΔA'B"C'都是⾮钝⾓三⾓形,由2?可知r(A,B,C)<r(A',B",C').∴r(A,B,C)<r(A',B',C').综上可知,所证成⽴.。
convex hull

convex hull
凸包(convex hull)是一种广泛应用的几何运算,它将一组二维点进行包围,形成一个凸多边形。
凸包是一种压缩技术,它将传感器或其他设备的采样点组合到一个允许检测和分析的空间内。
它涵盖了所有可见包括内部点的最大空间。
凸包也被用于表示一群动物各自所成形状或一组多边形集合中最高点之间的距离。
凸包计算通常使用 Convex Hull Algorithm,这是一种考虑所有点的有效计算凸包的算法。
它首先考虑所有点的范围,然后从该框架中求出最大边缘。
它有效地建立了点的位置,以确定一组点的几何结构,并建立最外层边缘的凸多边形。
凸包也可以用于几何图形模型,用于形成所有离散点的关联。
它涵盖了一组离散点,为多边形提供多边形形状,让它们更容易处理。
凸包也可以被应用于军事战略规划,以用于精确地处理前沿拥有者的特定情况。
从经典的几何和数学应用看,凸包是一种有用的算法,它可以通过简单的计算就可以得出准确的结果。
凸包的实现也能帮助我们更好地理解计算机科学中的数据分析,比如轮廓检测,数据压缩和几何图形处理。
它还能源自让我们更好地理解几何变换和图形变换,以及这些变换如何影响数据集。
【算法】凸包问题--分治法

【算法】凸包问题--分治法凸包问题--分治法求能够完全包含平⾯上n个给定点的凸多边形。
⽰例:⼀、分治法:(⼀)算法思路:(这⾥所说的直线都是有向直线的。
)将数组升序排序,若x轴坐标相同,按照y轴坐标升序排序。
最左边的点p1和最右边的点p_n⼀定是该集合凸包的顶点。
该直线将点分为两个集合,上包为S1,下包为S2。
在p1 p_n线上的点不可能是凸包的顶点,所以不⽤考虑。
在上包S1中,找到p_max(距离直线p1p_n最远距离的点),若有两个距离同样远的点,取∠p_max p1 p_n最⼤的那个点(即△p_max p1 p_n⾯积最⼤)。
(⼀次递归到这⾥结束)找出S1中所有在直线p1 p_max左边的点,这些点中⼀定有构成上包中左半部分边界的顶点,⽤上⾯的算法递归查找点,直到上包就是以p1和p_n 为端点的线段。
下包S2中找下边界同理。
*如何判断点是否在直线p1 p_max左边(同 p1 p_n上⽅)?如果q1(x1,y1),q2(x2,y2),q3(x3,y3)是平⾯上的任意三个点,那么三⾓形△q1 q2 q3的⾯积等于下⾯这个⾏列式绝对值的⼆分之⼀。
当且仅当点q3=(x3,y3)位于直线q1 q2的左侧时,该表达式的符号为正,该点位于两个点确定的直线的左侧。
(⼆)实现中碰到的问题如何⽤快速排序来排序Point类(内有坐标x,y)的⼀维数组?按照x坐标排序很简单,若碰到x相同,y不同的怎么办?在快排的原基础上修改,以j向前逼近说明:(第⼀个while循环)当前⽐较数的横坐标>基准点的时,j向前逼近。
此处不加等于号,排序是不稳定的,即相等元素的相对位置可能发⽣改变。
(快排详见博客:(第⼆个while为添加内容)⽐较相等元素的纵坐标,基准点的更⼩,j继续向前逼近,即相等元素的相对位置不发⽣改变;否则,则改变。
也就是将原来快排中while循环拆分为两个,增加相等元素另外⽐较纵坐标的情况。
while (i < j && points[j].getX() > center.getX()) {j--;}while (i < j && center.getX() == points[j].getX() && points[j].getY() > center.getY()) {j--;}/** (i<j)若points[j].getX()< center.getX()或 center.getX() ==* points[j].getX()且points[j].getY()<center.getY() 以上两种情况,需要赋值*/if (i < j)// 跳出循环也有可能时因为i=j,所以这⾥要判断⼀下points[i++] = points[j];如果使⽤全局数组visit标识点是否访问,能确定凸包的所有顶点,但怎么顺序输出?在已经求的凸包顶点⾥逐⼀确定边界,判断是不是所有点都在这条边界的⼀侧,如果是则确定⼀条边界。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
概念
凸包(Convex Hull)是一个计算几何(图形学)中的概念。
用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有点的。
严谨的定义和相关概念参见维基百科:凸包。
这个算法是由数学大师葛立恒(Graham)发明的,他曾经是美国数学学会(AMS)主席、AT&T首席科学家以及国际杂技师协会(IJA)主席。
(太汗了,这位大牛还会玩杂技~)
问题
给定平面上的二维点集,求解其凸包。
过程
1. 在所有点中选取y坐标最小的一点H,当作基点。
如果存在多个点的y坐标都为最小值,则选取x坐标最小的一点。
坐标相同的点应排除。
然后按照其它各点p和基点构成的向量<H,p>与x轴的夹角进行排序,夹角由大至小进行顺时针扫描,反之则进行逆时针扫描。
实现中无需求得夹角,只需根据向量的内积公式求出向量的模即可。
以下图为例,基点为H,根据夹角由小至大排序后依次为H,K,C,D,L,F,G,E,I,B,A,J。
下面进行逆时针扫描。
2. 线段<H, K>一定在凸包上,接着加入C。
假设线段<K, C>也在凸包上,因为就H,K,C 三点而言,它们的凸包就是由此三点所组成。
但是接下来加入D时会发现,线段<K, D>才会在凸包上,所以将线段<K, C>排除,C点不可能是凸包。
3. 即当加入一点时,必须考虑到前面的线段是否会出现在凸包上。
从基点开始,凸包上每条相临的线段的旋转方向应该一致,并与扫描的方向相反。
如果发现新加的点使得新线段与上线段的旋转方向发生变化,则可判定上一点必然不在凸包上。
实现时可用向量叉积进行判断,设新加入的点为p n + 1,上一点为p n,再上一点为p n - 1。
顺时针扫描时,如果向量<p n - 1, p n>与<p n, p n
>的叉积为正(逆时针扫描判断是否为负),则将上一点删除。
删除过程需要回溯,将之前所+ 1
有叉积符号相反的点都删除,然后将新点加入凸包。
在上图中,加入K点时,由于线段<H,K>相对于<H,C>为顺时针旋转,所以C点不在凸包上,应该删除,保留K点。
接着加入D点,由于线段<K, D>相对<H, K>为逆时针旋转,故D点保留。
按照上述步骤进行扫描,直到点集中所有的点都遍例完成,即得到凸包。
复杂度
这个算法可以直接在原数据上进行运算,因此空间复杂度为O(1)。
但如果将凸包的结果存储到另一数组中,则可能在代码级别进行优化。
由于在扫描凸包前要进行排序,因此时间复杂度至少为快速排序的O(nlgn)。
后面的扫描过程复杂度为O(n),因此整个算法的复杂度为O(nlgn)。