专利名称::一种基于扫描线算法的动态容差设置方法
技术领域:
:本发明涉及应用于地理信息系统中的扫描线算法,特别地,涉及到一种基于扫描线算法的动态容差设置方法。
背景技术:
:地理信息系统(GIS)是一种特定的十分重要的空间信息系统。它是在计算机硬、软件系统支持下,对整个或部分地球表层(包括大气层)空间中的有关地理分布数据进行采集、储存、管理、运算、分析、显示和描述的技术系统。地理信息系统的核心是处理空间地理数据,包括点面叠加、线面叠加和面面叠加,所有的叠加分析都是基于关联线段簇以及线段交点的处理。扫描线算法是经典的输出线段交点的算法。此算法是由Bentley和Ottmann提出的,其最原始的目的是对给定一系列线段,求出所有这些线段的交点并输出。其输入是一系列线段,输出是这些线段之间的交点。在扫描线算法的计算过程中,正确地求取线段的交点是非常重要的。然而实际计算中线段的坐标常常是用浮点数来表示的。浮点数的表示存在误差,并且在浮点计算过程中,误差会传递。因此每次计算过当前点的线段时,若不考虑误差,或者采用了错误的误差估计方法,有可能出现错误。现有技术中,或者仅是从理论上研究扫描线算法,认为所有数据均是精确的,忽略误差问题;或者是简单设置一个静态数值作为容差。然而,扫描线算法在实际应用中,不能回避误差的存在;并且在地理信息系统中应用时,可能碰到不同坐标系的地理数据,而这些数据的数值范围相差悬殊,例如以经绵度为单位的话,其数值大小小于1000;以千米为单位时,其数值大小可能在几万;以米为单位,其数值大小可能为几百万。因此静态设置容差不能保证扫描线算法判断事件点是否在线段上的正确性。
发明内容该发明目的是解决求取扫描线算法中浮点数值计算的容差问题,特别是解决在浮点计算存在误差的前提下,用扫描线算法处理不同数量级的数据时的动态容差计算问题,从而正确判断事件点是否在线段上,保证扫描线算法的正确性,即能正确求得所有交点,进一步地,保证了叠加分析的正确实现,使得地理信息系统可以提供更准确的地理信息。为实现上述目的,根据本发明的一个方面,提供了一种基于扫描线算法的动态容差设置方法,其包含如下步骤根据线段交点计算过程中的函数,利用公式i计算交点坐标的绝对误差;根据确定点是否在线段上过程中的函数,利用公式i和交点坐标的绝对误差计算容差;5(/(W.x))=/(|^))2+……+(|^(x))2公式i其中/表示关于变量^X2…、的函数,^y(^JC2,…X"))表示函数/的绝对误差;把此容差设置为判断点是否在线段上的容差。根据本发明的另一方面,提供了一种确定线段交点的方法,其包含如下步骤1)接收线段,得到事件点结构;2)从事件点结构中取得最小的事件点,对与此点关联线段进行处理并更新事件点结构;3)事件点结构为空时,输出交点集合;其中步骤2)包含计算线段交点,确定点是否在线段上,根据公式i计算容差,并把此容差设置为判断点是否在线段上的容差。本发明效果在于能够确定浮点数运算后的容差,进一步的,是在表示点坐标和线段等的浮点数值的运算存在误差的前提下,正确判断事件点是否在线段上,保证扫描线算法的正确性,即能正确求得所有交点,进一步地,保证了叠加分析的正确实现,使得地理信息系统可以提供更准确的地理信息。以下,结合附图来详细说明本发明的实施例,其中图l是实际计算交点与理论交点偏移示意图。图2是扫描线算法流程图。具体实施例方式关于误差分析的方法,实际的科学计算的情况是错综复杂的,每次计算会产生新的舍入误差并传播前面各步已有的误差,而运算次数又往往非常之多,常以数千万计,误差的累积过程是时增时减的,简单的按单调增长估计是不可取的,因为那样得到的误差界会远远超出实际情况,甚至会完全掩盖有用的结果。在实际应用中,由于多次运算中有舍入相抵,故实际误差应当小得多。多次运算的误差传递是相互独立的,并且不可能同时取得极值,应该采用一种乐观的方式来进行误差分析。根据正态分布的"3a原则",n次运算的累积误差以99.97%的概率保证s其中S是测量或计算的误差界,^是每次测量的误差。此公式表明误差产生与传递无关。在物理或者化学实验分析中,测量误差是许许多多微小的偶然因素共同作用的结果,必然服从正态分布。由这些服从正态分布的并且相互独立的测量误差参与计算而造成的误差分析常采用如下高斯误差传递公式《x土力-^^2(x)+^(力;心(—)=^-^-,少7一般地,5(/(Xl,X2,...、))=(!^(^))2+……+(^^(X))2。因为浮点数的精度都是有限的,所以扫描线算法中用浮点数表示点坐标和线段,在计算过程中会不可避免地产生误差。浮点计算经过多次运算后,由初始均匀分布的舍入误差造成累积误差必然服从正态分布(O,CT)。虽然初始误差分布为均匀分布,但是经过几步的计算之后,必然近似服从正态分布。因此把在物理化学测量或者计算中常用的高斯误差传递公式运用到浮点计算的误差分析中来。6扫描线算法的流程如图2所示,详细描述如下首先初始化以所有线^:端点初始化事件点结构Q并排序;初始化当前激活线段束R为空集合;当前所有线段有序集合为S;当前输出交点集合I为空集合。判断Q是否是空,如果是空集合,则计算结束,I即为计算而得的交点的集合;否则循环以下操作直至Q是空集合。从Q中取得最小的事件点P,并将其从Q中删除。查找R中以p为终点的线段,删除线段;根据容差查找R中经过p且p不是线段端点的线段,则此点是正常相交的交点,输出此点到I;并且,将这些线段的顺序反置;从S中选取从此点起始的线段,从S中删除,加入到R中去。以上三个操作每查找到一个线段后,计算查找到的线段与其相邻线段可能存在的交点,如果存在则把交点添加到Q中去。针对算法进行分析可得计算可能存在的交点时就产生误差,即求得的交点并不恰好是两线段的理论交点,而是有微小的偏移,如图1所示。而查找R中经过p且p不是线段端点的线段时也会继续产生误差,且需要判断这个误差结果是否小于容差,从而正确判断点p是否在线段上。扫描线算法中判断当前事件点是否在线段上一般用下述公式来实现。det=(point.x-head.x)*(tail.y-pointy)-(point.y-head.y)*(tail.x-point.x)其中point是当前点,head和tail分别是当前线段的两端点,x、y分别表示点的横、纵坐标值。当det等于0时,点point在线段上;否则,点point不在线段上。在此需要考虑误差。若简单地判断det--O,因为浮点计算的误差问题,必然不能正确得到过某点的线段;若设定一个静态值,又因浮点计算的误差与数值的大小相关,则这个静态值对某些数据可能正确,对其他数据可能不正确。本发明提供了一种动态设置容差的扫描线算法,根据要求交点的线段的外包来确定数值的大体范围,根据计算可能存在的交点步骤,计算此过程产生的交点坐标的绝对误差;再根据查找R中经过p且p不是线段端点的线段步骤,也即确定点p是否在线段上的步骤,以及已经得到的交点绝对误差进一步计算此过程产生的误差,即容差;在扫描线算法进行过程中,根据此容差确定过事件点p的线段。以上分析对自然分布的数据均成立。以外包即包含图层的最小外接矩形的长宽是106数量级、一般的相对坐标值即某一局部范围内点的坐标差值在x或者y坐标方向上是105数量级的数据为例,具体描述本发明。计算可能存在的交点,并计算此过程所产生的误差的具体过程如下,其中两线段分别以head0和tail0,headl和taill为起点和终点,所求交点为inter;x和y分别表示横、纵坐标;A代表相对误差;5代表绝对误差分别计算起点和终点的坐标差值doublezx=tail0.x-head0.x;doublezy=tailO.y-head0.y;doubleox=taill.x-headl.x;doubleoy=tail1.y-head1.y;doubleozx=headO.x-headl.x;doubleozy=headO.y-headl.y;以上六组运算中各个参数的坐标值都是精确的,则两个精确的数值的减法运算,其结果只有舍入误差。双精度浮点数的相对舍入误差为△=1.11x10—16。舍入误差与计算过程无关,是得到的计算结果需要舍入以在计算机中表示出来而引起的误差。doubledenominator=zx*oy-zy*ox;此运算有三次误差传递,两次乘法,一次减法;乘法传递相对误差,为V^xl.llx10—16=1.57xl(T16,舍入误差为1.11x10—16。此相对误差指由于计算造成的传递误差,其与舍入误差是相互独立的。因此,△Ox*o力=A(2y*ox)=>/l.572+l.ll2x1(T16=2x10-16。根据数据的特点,zx、zy、ox、oy、ozx、ozy等是小于105数量级数据。3(zx*oy)=5(zy*ox)=2x10_16x1010=2x10—6。5(denominator)=x2x10-6=2.8x10-6。根据对1()X数量级的数据,其积约为10(2X—"数量级的统计规律,得到denominator为109数量级的数据。A(denominator)=2.8xl0—6+10—9=2.8x10—15〉>1.1lx10—16的舍入误差,因此从这一步开始不再考虑舍入误差。doublenumeratorO=ox*ozy-oy*ozx;numerator0与以上denominator的i吴差分斗斤相同。doubleUa=numeratorO/denominator;传递相对误差A(Ua)=V^x2.8x1(T15=3.9xl(T15。i殳置inter点的坐标为(headO.x+Ua*zx,headO.y+Ua*zy),对此坐标值,其绝对误差是^:3.9xlO-"xl0^3.9xl(T10。查找R中经过p且p不是线段端点的线段,也就是判断p点是否在线段上,通过判断线段的端点和p点所构成的三角形的面积是否为O的操作完成,如果面积为0则点在线段上。此计算过程不考虑舍入误差,因为此处的点p是上述计算的可能存在的交点,其误差已经远远大于浮点表示的舍入误差。本计算的具体过程如下,其中,head和tail对应线段的两个端点,x和y分别表示横、纵坐标doublexl=p.x-head.x;doubleyl=p.y-head.y;doublex2=tail.x-p.x;doubley2=tail.y隱p.y;在此head,tail的数据均非中间结果,都是初始的输入数据,没有误差,则根据求得的交点的误差,上面各个差值的绝对误差为3.9x10—1Q。doubledet=xl*y2-x2*yl;此运算有三次误差传递,两次乘法,一次减法,只考虑传递误差△(xl)=A(_yl)=A(x2)=A(>2)=3.9x1(T10+105=3.9x1(T15。所以误差^:^V^x3.9x10—"xl(^xV^二7.8x10—5,则此值即为根据本发明思想,依据数据计算的动态容差。判断det的绝对值是否小于误差3=7.8x10—5,如果小于则点在线段上,否则,线段不过该点。以上是对106数量级数据的误差分析。在整个分析过程中,有一些假设,即外包的数量级下,都是一些自然的数据,即坐标的数量级小于外包的数量级。对任意外包为(1()X)数量级的数据,带入到上述分析过程,可得其容差计算公式为'.7.8xl0(2〃17),其中X为数量级。此容差仅仅适用于用上述方法计算交点、并判断点是否过线段的思路。根据本发明思想,针对不同的计算流程,有不同的误差容差计算公式。在真实地理数据的测试中,用此公式计算得到的容差保证了算法的正确性,实验数据如下表所示9表l测试以上述代码分析的外包为106的数据结果<table>tableseeoriginaldocumentpage10</column></row><table>本发明计算而得的容差为7.8x10—5,上表真实地理数据的测试说明了用本发明计算的动态容差以极大概率地大于计算过程中产生的误差,表明本方法能保证算法的正确性。本发明对于数值采用浮点数表示并且需要判断数值是否完全相等的问题提供了一种解决思路。应该注意到并理解,在不脱离后附的权利要求所要求的本发明的精神和范围的情况下,能够对上述详细描述的本发明做出各种修改和改进。因此,要求保护的技术方案的范围不受所给出的任何特定示范教导的限制。权利要求1.一种基于扫描线算法的动态容差设置方法,其包含如下步骤根据线段交点计算过程中的函数,利用公式1计算交点坐标的绝对误差;根据确定点是否在线段上的过程中的函数,利用公式1和所述交点坐标的绝对误差计算容差;公式1其中f表示关于变量x1,x2,…xn的函数,δ(f(x1,x2,…xn))表示函数f的误差;将所述容差设置为判断点是否在线段上的容差。2.根据权利要求1所述的方法,其特征在于,对于/^x士y,3.根据权利要求1所述的方法,其特征在于,对于/^;cxy,4.根据权利要求l所述的方法,其特征在于,对于/=王,少少25.—种确定扫描线交点的方法,其包含如下步骤1)接收线段,得到事件点结构;2)从所述事件点结构中取得最小的事件点,对与此点关联线段进行处理,更新所述事件点结构;3)所述事件点结构为空时,输出交点集合;其中步骤2)包含根据线段交点计算过程中的函数,利用公式1计算交点坐标的绝对误差;根据确定点是否在线段上过程中的函数,利用公式1和所述交点坐标的绝对误差计算容差;将所述容差设置为判断点是否在线段上的容差。6.根据权利要求5所述的方法,其特征在于,所述与此点关联线段包含终止于此点的线段、经过此点的线段或者始于此点的线段。7.根据权利要求5所述的方法,其特征在于,对于/=^±;;,8.根据权利要求5所述的方法,其特征在于,对于/^xx少,9.根据权利要求5所述的方法,其特征在于,对于/=土,全文摘要本发明提供一种扫描线算法,包括步骤根据计算容差的公式和计算线段交点的过程,计算交点坐标的绝对误差;根据计算容差公式、交点坐标的绝对误差和确定点是否在线段上的计算过程,计算判断点是否在线段上的容差;根据此容差确定事件点是否在线段上。本发明能够确定浮点数运算后的容差,进一步的,是在表示点坐标和线段等的浮点数值的运算存在误差的前提下,正确判断事件点是否在线段上,从而保证扫描线算法正确性。文档编号G06F17/10GK101458678SQ20071017958公开日2009年6月17日申请日期2007年12月14日优先权日2007年12月14日发明者方金云,朱效民,程振林,林齐申请人:中国科学院计算技术研究所