收藏 分享(赏)

算法设计与分析(十).ppt

上传人:weiwoduzun 文档编号:5698611 上传时间:2019-03-13 格式:PPT 页数:49 大小:1.72MB
下载 相关 举报
算法设计与分析(十).ppt_第1页
第1页 / 共49页
算法设计与分析(十).ppt_第2页
第2页 / 共49页
算法设计与分析(十).ppt_第3页
第3页 / 共49页
算法设计与分析(十).ppt_第4页
第4页 / 共49页
算法设计与分析(十).ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

1、算法设计与分析 2010.9 (ACM创新实验班),王多强 ,十、计算几何学,什么是计算几何学?,计算几何学是计算机科学的一个分支,专门研究解决几何问题的算法。这一类问题中,输入一般是关于一组几何对象的描述,如点、线段、多边形等。输入则是对有关这些对象的问题的解答,如直线是否相交?是否为一个新的几何对象,如顶点集合的凸包等。,p1,p2,p4,p2,计算几何学常见问题,折线段的拐向判断 判断点与线、矩形、多边形、圆之间的相对位置关系 计算点到线段、折线、矩形、多边形的最近点 计算线段、直线与线、矩形、多边形、圆的交点 判断形状间的包含,如一个矩形是否在另一个矩形之中 凸包问题等,在现代工程和数

2、学领域,计算几何在图形学、机器人技术、超大规模集成电路设计和统计学等诸多领域,都有着十分重要的应用。,10.1 线段的性质,1.点的表示n个点输入对象记为:p1,p2,.,pn,其中每个pi=(xi,yi),xiR,yiR。形状一般用点的序列来表示,如多边形用顶点集p1,p2,.,pn表示。,2.点的凸组合(convex combination)两个不同的点p1=(x1,y1)和p2=(x2,y2)的凸组合是满足下列条件的任意点p3=(x3,y3):对于a,(0a1),有: x3=ax1+(1-a)x2 ,y3=ay1+(1-a)y2。也可写作p3=ap1+(1-a)p2。p1,p2,p3的相

3、对位置关系如图:亦即,p3位于穿过p1和p2的直线上、并处于p1和p2之间(包括p1和p2两点)的任意点。而线段p1p2可以看作是p1和p2的凸组合的集合,这里,称p1、p2是线段的p1p2的端点。如果考虑有向性,可以记有向线段为p1p2。如果p1是原点(0,0),则有向线段p1p2简称为向量p2。,向量p1和p2的叉积可以看作是由点(0,0),p1,p2和p1+p2=(x1+x2,y1+y2)所形成的平行四边形的面积。如图所示:叉积也被定义为下面的行列式形式:,叉积,分析:如果p1p2为正数,则相对于原点(0,0)来说,p1在p2的顺时针方向上;如果p1p2为负数,则p1在p2的逆时针方向上

4、;下图示出向量p的顺时针区域和逆时针区域。如果叉积为0的话,则p1、p2共线,p1、p2指向同一个方向或相反的方向。,p的逆时针方向,p的顺时针方向,p1、p2同向共线,p1、p2逆向共线,如何判断线段之间的相对方向?,已知两个有公共端点p0的有向线段p0p1、p0p2,计算叉积:(p1-p0)(p2-p0)=(x1-x0)(y2-y0)-(x2-x0)(y1-y0)若0,则p0p1在p0p2的顺时针方向上若0,则p0p1在p0p2的逆时针方向上若0,则p0p1和p0p2共线,确定连续线段是向左转还是向右转?,已知两条连续的线段p0p1、p1p2,在p1点是向左转还是向右转?方法一:运用三角公

5、式求出p0p1p2,判断其转向;方法二:运用叉积,无需对角进行计算即可判断线段的转向。亦即如图所示,检查有向线段p0p2是在有向线段p0p1的顺时针方向还是在其逆时针方向?,计算叉积:(p2-p0)(p1-p0)若叉积0,则p0p2在p0p1逆时针方向,在点p1就是左转。若叉积0,则p0p2在p0p1顺时针方向,在点p1就是右转。若叉积0,则p0、p1、p2三点共线。,确定两个线段是否相交,跨域:给定一个线段p0p2线,如果点p1位于某一直线的一边,而点p2位于该直线的另一边,则称线段p0p2跨越了该直线。如果p1和p2落在直线上,则出线共线情况。 相交:当且仅当下面两个条件中至少一条成立时,

6、两个线段相交:1)每个线段都跨越了另一线段的直线;2)一个线段的某一端点位于另一线段上。,p1,p2,程序描述 1)定义过程 DIRECTION(pi,pj,pk):使用叉积计算线段pipk相对于线段pipj的方位,返回叉积的值。如图所示,令d1= DIRECTION(p1,p2,p3),d2= DIRECTION(p1,p2,p4),若d10,d20,且两者的符号不同,则线段p3p4跨越线段p1p2的直线,如图a)和b)。若d10,则线段p3在线段p1p2的直线上,如图c)或d)。,p1,p2,p3,p4,p1,p2,p3,p4,p1,p2,p3,p4,a),b),c),p1,p2,p3,p

7、4,d),2)定义过程 ON-SEGMENT(pi,pj,pk):当dk0时, ON-SEGMENT(pi,pj,pk)判断pk是否位于线段pipj上:点pk位于pipj上的充分必要条件是pk落在端点pi和pj之间,包括与端点pi或pj重叠。如图:图c)是线段相交的情形,而图d)中的两个线段 并不相交。,p1,p2,p3,p4,c),p1,p2,p3,p4,d),3)定义过程 SEGMENTS-INTERSECT(p1,p2,p3,p4):布尔函数,判断线段p1p2和p3p4是否相交,相交,则返回TRUE,否则返回FALSE。 4)过程的描述如下:SEGMENTS-INTERSECT(p1,p

8、2,p3,p4)d1DIRECTION(p3,p4,p1)d2DIRECTION(p3,p4,p2)d3DIRECTION(p1,p2,p3)d4DIRECTION(p1,p2,p4)if(d10 and d20)or(d10 and d20) and (d30 and d40)or(d30 and d40) then return TRUEelse if d10 and ON-SEGMENT(p3,p4,p1) then return TRUE else if d20 and ON-SEGMENT(p3,p4,p2) then return TRUE else if d30 and ON-S

9、EGMENT(p1,p2,p3) then return TRUE else if d40 and ON-SEGMENT(p1,p2,p4) then return TRUE else return FALSEEND SEGMENTS-INTERSECT,DIRECTION(pi,pj,pk)return (pk-pi)(pj-pi) END DIRECTIONON-SEGMENT(pi,pj,pk)if min(xi,xj)xkmax(xi,xj) and min(yi,yj)ykmax(yi,yj) then return TRUEelse return FALSE END ON-SEGM

10、ENT,例:,p1,p2,p3,p4,p1,p2,p3,p4,a),b),分析:,上述问题也可以按照通常的解析几何的方法求解,如计算出形如y=kx+b的直线方程,然后求直线交点,然后检查交点是否落在线段的端点之间,判定线段的相交性。我们的算法仅使用加、减、乘和比较运算就完成了计算,没有使用除法,不需要三角函数计算。 优点: 除法、三角函数的计算代价都很高 除法的舍入误差问题 近似平行线时,求斜率k对计算机除法运算的精度非常敏感,很容易产生溢出问题等。,10.2 确定任意一对线段是否相交,对给定的一组线段,确定其中任意两个线段是否相交?这里假设:1)所有的线段不垂直的(水平的可以)。2)相交于同

11、一点的线段数2。(假设的目的是为了在算法设计中简化对边界条件的处理。可以证明假设的合理性,对于假设外的情况也可以进行有效处理),扫除技术(Sweeping):在几何空间中,假想存在一条垂直直线,称为扫除线。从左到右移动扫除线。扫除线移动时会穿过一组已知的几何物体,而扫除线移动的空间方向可以看作是一种次序(时间顺序或空间位置次序)。利用穿过几何体时扫除线的这种次序对几何物体进行空间排序、筛选或其它处理。这种技术称为扫除技术,线段排序,根据假设,不存在垂直线段,所以任何线段与垂直扫除线至多有一个交点。因此,在某x处,可以根据线段与扫除线交点的y坐标对线段进行排序。考察两条线段s1和s2。如果横坐标

12、为x时,垂直扫除线与这两条线段都相交,则称这两条线段在x处是可比的。如果s1和s2在x处可比,并且在x处,扫除线的交点与s1的交点比与s2的交点高,则说在x处,s1位于s2之上,记为s1xs2。 如图,有1)arc2)atb、atc 、btc3)buc4)线段d与其它任何线段都不可比,对任意给定的x,关系x是定义在那些在x出与扫除线相交的线段上的全序关系,即任何两条这样的线段都是可比的。当线段的左端点遇到扫描线时,线段进入排序,而当其右端点遇到扫除线时,就离开排序。随着x的不同,扫除线与扫除线的交点是不断变化的,线段间的次序会随之而改变。如图,线段e和f相交与o点。在o的左方,evf,而在o的

13、右方,fwe交点o:存在线段次序变换的现象,当扫除线穿过两条线段的交点时,它们在全序中的位置将被颠倒,如图所示,线段e、f在交点o处的次序发生了颠倒。由于假定没有三条线段相交于同一点,所以必有某条垂直线扫除线x,使得相交线段e和f在全序x中是连续的。如图,任何穿过阴影区域的扫描线(如z)都是的e和f在其全序中连续。,扫除线的数据结构定义,扫除线一般要维护下列两组数据:1)扫除线状态(sweep-line status):即与扫除线相交的物体之间的关系;2)事件点(event-point schedule):是一个从左向右的x坐标的排列,这些x坐标记录了扫除线状态发生变化的位置。,在本问题中,每

14、条线段的端点都是事件点,因为当扫除线进入(离开)任何端点处,都将引起扫除线状态的改变。而这,通过增加x坐标,从左向右对线段的端点进行排序即可得线段问题的所有事件点。如果两个或多个端点位于同一条垂直线上,若y坐标不同,则有坐标小的排在前面,若y坐标也相同(即相交于同一点),则看另一端点的x坐标,小的放在前面。,基于上述定义,根据事件点调度序列检查线段。 当扫除线遇到线段的左端点时,就把该线段插入到扫除线状态中; 当扫除线遇到线段的右端点时,就把它从扫除线状态中删去; 当两条线段在全序中第一次变为连续(连续排列在一起)时,就检查它们是否相交(注:非连续排列在一起的线段是不会相交的)。 扫除线状态是

15、一个全序T,定义T上的操作如下: INSERT(T,s):把线段s插入T中; DELETE(T,s):把线段s从T中删除; ABOVE(T,s):返回T中紧靠线段s上面的线段; BELOW(T,s):返回T中紧靠线段s下面的线段。输入n条线段,运用红黑树,可以在O(logn)的时间内执行上述操作。,判断线段集合中线段相交的过程,ANY-SEGMENTS-INTERSECT(S)/S为n个线段的集合,如果找到S中任一对线段相交就返回TRUE;否则,若S中没有任何线段相交,则返回FALSE。全序T由一棵红黑树实现。/ Tsort the endpoints of the segments in S

16、 from left to right,breaking ties by puting left endpoint before right endpoints and breaking further ties by putting points with lower y-coordinates firstfor each point p in the sorted list of endpointsdo if p is the left endpoint of a segment sthen INSERT(T,s)if(ABOVE(T,s) exists and intersects s)

17、 or (BELOW(T,s) exists and intersects s) then return TRUEendifif p is the right endpoint of a segment sthen if(both ABOVE(T,s) and BELOW(T,s) exists and ABOVE(T,s) intersects BELOW(T,s) then return TRUEDELETE(T,s)endifendforreturn FALSE END ANY-SEGMENTS-INTERSECT,例:,ANY-SEGMENTS-INTERSECT的执行过程。每条虚线都

18、是一个事件点处的扫除线,每条扫除线下的线段名排序为for循环结束时的全序T,在该循环中,要对各对应的事件点进行处理。当线段c被删除时,即可发现线段d和b相交。,10.3 凸包问题,1.关于多边形的概念 1)多边形:是平面上一组首尾相连的折线段所构成的封闭曲线称为多边形。 2)边:构成多边形的折线段称为多边形的边。 3)顶点:连接两条连续边的点称为顶点。 。,边,顶点,4)简单多边形:内部没有交叉的多边形称为简单多边形。非简单多边形 简单多边形对一个简单多边形, 内部包围的区域称为该多边形的内部; 多边形的边构成边界; 边界以外的区域称为多边形的外部。,外部,内部,边界,凸多边形:一个简单多边形

19、,如果给定其边界上或内部的任意两点,连接这两个点的线段上的所有点都包含在该多边形的边界上或内部,则该多边形为凸多边形(convex polygon)。,非凸多边形,凸多边形,内部,内部,点的极角:一个点p相对于原点o的极角为向量p的极角。 p相对于另外一个点q的极角是向量p-q的极角。 如,例:相对于(2,4),点(3,5)的极角为向量(1,1)的极角:45(/4)点(3,3)的极角为向量(-1,1)的极角:315(7/4),o,p,o,p,q,2.凸包的定义凸包:点集Q的凸包是一个最小的凸多边形P,使得Q中的每个点或者在P的边界上,或者在P的内部,记为CH(Q)。 例:如图所示,p0p12的

20、凸包是p0p=p=p10p12围成的凸多边形。其中p0、p1、p3、p10、p12既是CH(Q)的顶点,也是Q中的点。,点集Q=p0,p1,.,p12及其凸包CH(Q),3. Graham扫描法,定义一个候选点的堆栈S。 在S上定义操作 TOP(S):读取栈顶的点,但不取走。 NEXT-TO-TOP(S):返回读取栈顶下面的点,但不取走。 POP(S):摘除栈顶的点 PUSH(pi,S):将点pi压入栈。 Graham扫描算法GRAHAM-SCAN描述如下。 过程GRAHAM-SCAN返回时,堆栈S中从底部顶部,依次是按逆时针方向排列的CH(Q)中的顶点。,GRAHAM-SCAN(Q)let

21、p0 be the point in Q with the minimum y-coordinate or the leftmost such point in case of a tie.let(p1,p2,.pm) be the remaining points in Q,sorted by polar angle in counterclockwise order around p0(if more than one point has the same angle, remove all but the one that is farthest from p0)PUSH(p0,S)PU

22、SH(p1,S)PUSH(p2,S)for i3 to mdo while the angle formed by points NEXT-TO-TOP(S),TOP(S), and pi makes a nonleft turndo POP(S)PUSH(pi,S) return S,关于算法的说明,1)第1行选取当前具有最小y坐标的点作为p0。如果有数个这样的点,则选取最左边的点作为p0。p0是找到的CH(Q)中第一个顶点:最下、左方的点。如:,2)第2行对除p0之外的其它点,根据它们相对于p0的极角进行排序。Q中每个点关于p0的极角(弧度表示)0,),所以点按照该极角排序后,得到的是这些

23、点按相对于p0的逆时针方向排序的序列。,如果有两个或多个点相对于p0的极角相同,则除了与p0距离最远的点以外,其余的点都可以不考虑,因为这些点都是p0与最远点的图凸组合。设,剔除可以被凸组合的点后,除p0外剩余点的数目为m。,3)初始化首先将p0、p1、p2入栈。 p0、p1、p2的连接关系如图所示。,4)循环的每一步对点p3、p4.pn依次进行处理凸包顶点的判定条件:按逆时针方向通过凸包时,在顶点处应该左转。如果发现在顶点处没有左转,则该顶点不是凸包顶点,应被删除。,判别对象:当前的栈顶顶点,注:不是pi本身判别方法:计算NEXT-TO_TOP(S)TOP(S)pi的夹角方向(叉积计算),若

24、非左转,从栈顶删除S,再重复该过程(while循环),删除所有不能左转的点。最后pi将作为新的凸包顶点压如栈。 。,p10,例:,例:,例:,GRAHAM-SCAN的时间复杂度是O(nlogn)。,GRAHAM-SCAN(Q)let p0 be the point in Q with the minimum y-coordinate or the leftmost such point in case of a tie.let(p1,p2,.pm) be the remaining points in Q,sorted by polar angle in counterclockwise or

25、der around p0(if more than one point has the same angle, remove all but the one that is farthest from p0)PUSH(p0,S)PUSH(p1,S)PUSH(p2,S)for i3 to mdo while the angle formed by points NEXT-TO-TOP(S),TOP(S), and pi makes a nonleft turndo POP(S)PUSH(pi,S) return S,顺序查找: (n),排序: O(nlogn),入栈: O(1),for循环执行m-2次,里面的while循环对栈中的顶点进行测试,每个顶点有且仅有一次机会入栈,所以整个for循环的执行时间是O(n),定理10.1 如果在一个点集Q上运行GRAHAM-SCAN,其中|Q|3,则在过程终止时,栈S从底到顶,按逆时针方向顺序包含了CH(Q)中的各个顶点。(证明自学),4.Jarvis步进法,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报