一种两点-对称的直线生成方法

文档序号:6612908阅读:347来源:国知局
专利名称:一种两点-对称的直线生成方法
技术领域
本发明涉及计算机图形学领域,具体地说,是涉及一种两点-对称的直线生成方法。

背景技术
在显示基于目标地理位置的信息时,需要频繁调用基础图形生成算法来进行地理图形描画,因此高效的图形描画算法,即计算机图形学基础算法研究是该软件平台研究的关键之一。现有技术中,嵌入GIS设备几乎都存在地理图形描画速度慢的问题。快速高效的图形生成算法无疑会极大地改善地理信息服务的系统性能和效率,提高用户满意度和产品竞争力。
在计算机图形学领域以及更广领域,直线是组成各种图形的基本元素,可以通过像素生成许多离散的小直线段,来逼近欲生成的曲线和各种复杂图形。因此,直线生成的效率是其它各类图形生成效率的基础。在嵌入系统GDI图形库的画图函数中,直线段生成的效率将直接决定整个图形系统的性能和效率。
对于直线的生成算法,40多年来,许多人进行了深入的研究,并已出现许多有效的算法。在计算机图形学基础算法研究中,对于光栅扫描显示器的基于像素的点式图元生成来说,直线的生成算法总的来说可以分为三类第一类为单点生成算法,以效率最高的Bresenham直线生成算法为代表;第二类为行程长度算法。第三类为N步(N-Step)算法。有R.A.Eamshow的直线生成算法,X.Wu的双步增量画线算法,Mandelbret的用实型数的精确直线生成算法,Graham的并行生成直线法,J.R.Rankin提出的RB算法,P.Graham的改进RB算法,DDA算法,刘永奎的直线对称生成算法等等很多。对于单点直线生成算法,Bresemham算法的计算量已达到最小,也就是说单点画线算法已无改进余地。
图1是光栅扫描显示器的直线显示示意图。光栅扫描显示器的显示屏是由许多被称之为像素的点组成的,其分布排列形式是水平直线和垂直直线构成的网格,当我们要在显示器上画一条曲线时要逐点地选择离曲线最近的像素点将其点亮,这就是像素级的生成方法,生成的图形精度小于1/2个像素。对于光栅扫描显示器而言,点是最基本的元素,这里的点不是理想的几何上的点,而是一个像素。图1中所示的是直线的像素生成效果,理想的像素(实心圆)分布与实际的像素(空心椭圆)分布是不同的,这是因为像素是有一定大小的,并且坐标值是整数值。我们希望表示一条直线的像素点集合应该分布的尽可能均匀,而且像素点尽可能地靠近线段。图中的阴影方框,表示的是以理想的像素为中心的实际物理显示器像素。
计算机图形学基础算法的研究已经有40余年的历史,其发展已经相当成熟,但是基础算法的微小进步就会可观地改善图形系统效率。因此,研究、改善和优化基础图形生成算法有着很重要的意义。


发明内容
本发明所要解决的技术问题是在于需要提供一种两点-对称的直线生成方法,以提高图形系统中直线的生成效率。
为了解决上述技术问题,本发明提供了一种两点-对称的直线生成方法,其特征在于 根据直线始端像素点一次生成直线始端侧的两个后趋像素点,其中,距离所述始端像素点较远的后趋点为始端侧第一后趋像素点,所述始端像素点与所述始端侧第一后趋像素点之间的后趋像素点为始端侧第二后趋像素点; 按照同趋规则,根据直线终端像素点,一次生成直线终端侧的两个后趋像素点,其中,距离所述终端像素点较远的后趋点为终端侧第一后趋像素点,所述终端像素点与所述终端侧第一后趋像素点之间的后趋像素点为终端侧第二后趋像素点; 将所述始端侧第一后趋像素点作为始端侧当前的始端像素点,将所述终端侧第一后趋像素点作为终端侧当前的终端像素点,以2个像素单位为步进长度,循环生成所述直线剩余的像素点。
上述的直线生成方法中,根据所述始端像素点一次生成所述始端侧的两个后趋像素点,可以包括将坐标空间的四个象限按照斜率2或1/2划分为16个卦限,通过模式判断一次生成所述始端侧的两个后趋像素点。
进一步地,所述模式判断所采用的模式种类在每个卦限内可以是确定的。更进一步地,所述模式种类在每个卦限内可以为3种。
上述的直线生成方法中,如果所述直线在除去所述直线始端像素点和所述直线终端像素点后,剩余的像素点数量用4整除后还有余数,则可以以所述始端侧最后一次迭代生成的第一后趋像素点作为当前的始端像素点,根据所述直线的斜率,生成所述直线上与所述余数对应的所述始端侧与所述终端侧中间的接点。
进一步地,所述余数为1,对应的所述接点为1个,可以以所述始端侧最后一次迭代生成的第一后趋像素点作为当前的始端像素点,根据所述直线的斜率,生成所述接点; 所述余数为2,对应的所述接点为2个,可以以所述始端侧最后一次迭代生成的第一后趋像素点作为当前的始端像素点,根据所述直线的斜率,首先生成所述接点中距离所述当前的始端像素点较近的那1个接点,然后再生成剩余的那1个接点;及 所述余数为3,对应的所述接点为3个,可以以所述始端侧最后一次迭代生成的第一后趋像素点作为当前的始端像素点,根据所述直线的斜率,首先生成所述接点中距离所述当前的始端像素点最近的第1个接点,然后再生成距离所述当前的始端像素点次近的第2个接点,最后将所述第1个接点对称到所述终端侧,得到所述接点中剩余的那个接点。
与现有技术相比,本发明一次采用步进为2的迭代方法,加上直线本身具有的对称性,一次迭代即可生成四个点,因此较现有技术相比,有效提高了直线的生成效率,是一种实用、快速的直线生成方法。



图1是光栅扫描显示器的直线显示示意图。
图2A和图2B是Bresenham单点画线示意图。
图3A是把坐标空间的八个卦限按照斜率2进行划分的示意图。
图3B是Freeman链码示意图。
图4是两点法在第一象限内画直线时像素的模式示意图。
图5A和图5B是栅格显示器上直线段像素的示意图。
图6是本发明方法实施例的步骤示意图。
图7是本发明方法在斜率为
时始端侧后趋点生成示意图。
图8是与图7所示情形相对称的终端侧后趋点生成示意图。

具体实施例方式 以下结合附图和对本发明作进一步地详细说明。
为了便于更好地理解和实施本发明,以下先简单阐述Bresenham算法的内容。由Bresenham提出的直线生成算法实际上也是简单的DDA算法。即在某一计长方向上,每次必变化一个单位步长或一个像素单位,另一个方向上的变化量可以通过计算得到,也即通过浮点运算和四舍五入来选下一个点。但是Bresenham方法对下一个点的选择,是通过判断一个反复迭代的误差因子是否大于零来进行的。在迭代计算误差因子的时候,只用到了整型数加法和移位操作,计算量很小,因而得到了广泛的应用。
Bresenham单点画线方法假设被描画的直线段在二维坐标平面中从始点(x1,y1)到终点(x2,y2),假设x1<x2。经变换后可以表示为从(0,0)到(dx,dy),其中dx=x2-x1,表示X轴方向上的变化;dy=y2-y1,表示Y轴方向上的变化。此时直线方程可以化简为 (式1) 在图2A和图2B所示的Bresenham单点画线示意中,如果假设已经生成的当前点Pi-1的坐标为(r,q),则Si的坐标为(r+1,q),Ti的坐标为(r+1,q+1),由表达式1可以知道,直线理论上应该描画的精确点距离下一个实际上可以选择的像素Ti和Si的距离t和s分别为 (式2) (式3) 由此,可知 (式4) 这样,就可以通过s和t的大小关系来选择下一个点应该画Si还是Ti。但由于式2中dx>0,可以用dx(s-t)的正、负来知道s、t的大小关系,从而作为选择下一个像素点Si和Ti的标准。事实上,由(3-2)式我们还知道,dx(s-t)必然是一个整数值,因为整数乘、加、减的结果还是整数,这就可以免去对浮点运算的要求。若令dx(s-t)=di,则di就是第i步的误差因子,当di>=0时,s>=t,要选择Ti点(如图2A所示),否则选择Si点(如图2B所示),将di=dx(s-t),r=xi-1,q=yi-1代入式4可得 di=2(xi-1·dy-yi-1·dx)+2dy-dx (式5) 因(x0,y0)=(0,0)(将直线起始点都抽象为(0,0)点),i=1,由上式可得到di的初值为d1=2dy-dx。为了求出第i+1步和第i步的误差因子迭代关系,可以用i+1代替式(3-5)中的i,得到 di+1=2(xi·dy-yi·dx)+2dy-dx(式6) 从di+1中减去di得 di+1-di=2dy(xi-xi-1)-2dx(yi-yi-1) (式7) 因为xi-xi-1=1,由上式可得 di+1=di+2dy-2dx(yi-yi-1)(式8) 如果当前的误差因子di<0,选点Si,yi=yi-1,那么下一步的误差因子di+1应该为 di+1=di+2dy(式9) 如果di>=0,选点Ti,yi=yi-1+1,那么下一步的误差因子di+1应该为 di+1=di+2(dy-dx) (式10) 这样我们就有了迭代公式,如表达式9和表达式10所示。由此,可以根据当前点的误差因子di方便地计算出下一个点的误差因子di+1。还可以根据当前点di是否大于零实现对下一个像素Si或Ti进行快速选择。有了误差因子的初始值和迭代公式,就可以用循环的点生成来画出整条直线,下面描述了线段的生成过程。
当生成线段的第一个像素点后,判断并迭代当前点的误差因子d。如果d大于等于0,则使用迭代公式(3-9)更新误差因子,并生成下一个像素点Si的坐标,否则使用迭代公式(3-10)更新误差因子,并生成下一个像素点Ti的坐标。然后描画出第二个像素点。重复以上步骤共dx次,就生成了整个线段。
当把坐标空间的四个象限按照斜率1划分为8个卦限时,由于XY平面各种8分和4分区域间的对称性,我们可以通过对称、反演使所有的直线都映射到斜率
区间的情况来处理,从而简化实际操作的程序。
下面阐述两点-对称法中的两点生成法。使用Bresenham方法可以使画点运算量很小,但是每次只能画一个点。可以考虑使用Freeman链码理论对其进行改进,当发现直线在特定的斜率区域内时,直线的点阵序列有一定的规律性,通过前面点的特征可以推断后面若干的点的分布。例如,把坐标空间的八个卦限按照斜率2(1/2)划分为图3A所示的16个部分时,在某卦限内,直线的点阵分布仅有图4所示的三种情况,可以通过模式判断(比较)来一次画出两个点,总的计算量为一次求点计算、两次比较。可以比Bresenham单点生成画法速度快1到2倍。
出于模式识别的目的,以图3B所示的不同斜率的8个小箭头直线段作为基元,来描述线画图形,即Freeman链码,图中的圆可以认为是光栅点或像素,并指出一条直线的链码应满足下面3个条件 ①最多只有两个相邻基元(码)出现; ②上述两个基元(码)的其中之一只能单个出现(不会连续出现); ③这个单独出现的基元(码)一定是均匀分布在整个直线链码中。
在光栅显示器上生成直线的过程可以理解为对直线编码过程。从直线上的一个点移到下一个点,一定对应着Freeman链码的8个基元之一。由条件①和②可知,在生成直线时,最多只可能有8个基元中的两个相邻的基元出现在该直线的链码中,在这种只由这两个基元组成的链码中其中有一个基元不会连续出现,这就意味着该基元出现之后,必然是另外一个基元出现。这就说明,存在不用计算就可以预测后趋点的可能性。当然,水平垂直线和斜率为正负1的直线,只会出现一个基元连续的情况,这时直线的生成可以不用计算而直接装入帧缓冲器。
按上面的思路,把XY平面所有的直线按其斜率2和1/2划分为图3A的16部分时,在第1部分,只有Freeman基元“0”、“1”出现,其中基元“1”是单独出现的,基元“1”后,必然会出现一个或多个基元“0”。以下结合图4所示的两点法在第一象限内画直线时像素的模式,直线在特定的斜率区域内时,直线的点阵序列有一定的规律性,通过前面点的特征可以推断后面若干的点的分布。当我们把坐标空间的八个卦限按照斜率2(1/2)划分为图3A所示的16个部分时,在某卦限内,直线的点阵分布最多仅有图4所示mode42、mode43和mode44共三种情况,可以通过模式判断(比较)来一次画出两个点,总的计算量为一次求点计算、两次比较。可以比Bresenham单点生成画法速度快1到2倍。
继续参阅图4,mode41这一行,表示的是直线的斜率在0到1/2之间;mode44这一行,表示的是直线的斜率在1/2到1之间;mode45这一行,表示的是直线的斜率在1到2之间;mode47这一行,表示的是直线的斜率大于2。
在图3A的第2部分,只有Freeman基元“0”、“1”出现,其中基元”0”是单独出现的,基元“0”后,必然会出现一个或多个基元“1”。同样在其他的部分,也是有类似规律。由于对称性,仅列出了第一象限的四个区间的情况。其余象限可参考第一象限,不再详细描述。事实上,解决了第一象限的直线段生成问题,其它象限的情况就都同时得到了解决。设计出了
区间的算法,由于坐标对换对称性,就解决了第一象限的算法问题。
下面分析一下循环(运算)次数问题,对斜率处于图3A第1部分的直线来说,本来单像素点生成的循环次数应为dx,两点生成情况下每当基元“1”出现时,一次运算可以生成两个点,应减去基元“1”出现的次数,即dy,所以循环次数应为dx-dy。对于斜率处于第二部分的直线,无论每次循环生成一个还是两个点,y坐标都要加1,所以循环次数应为dy。那么,两点法可以比单点生成法快多少呢?这其实还要取决于直线斜率。平均的来说,有1/2的概率一次生成两个点。
下面阐述两点-对称法中的对称原理。图5A和图5B表示出了栅格显示器上直线段像素的对称性,两者表示的是同一条直线,其中图5A表示的是几何坐标系,斜率大于1;而图5B表示的是屏幕坐标系,斜率小于1。从图5A和图5B中可以发现对称原理以直线中点为界,其两边的像素是对称的,这样每算出一边的点就可以利用对称画出另一边的点,这样直线的生成是从两端向中间进行的。
当直线端点的坐标为整数时,可以发现以直线理想中点对称的两段直线的点阵序列趋势相同,也就是说两边的像素排列是完全对称的。如果利用这个对称性,就可以进行一次判断便生成关于直线理想中点对称的两个点。所以,可以在计算生成一边的一个或多个点后直接对称地生成另一边的一个点或多个点,即按照同趋规则求出另一边的点。
单点对称算法需要注意中间点的处理问题,当生成的线段的像素总数为奇数时,要单独生成中间这一个点。但是在中间点的误差因子刚好等于零时,从线段的不同端点开始生成的中间点是不确定的,这样从不同的端点开始生成同一条线段,就会在中间多出一点,后来对算法进行了改进,也就是把中间多余出来1、2或3个点单独生成,就可以解决这个问题。对称算法可以使直线的生成速度快两倍。当然,“两点-对称”描画方法要也要把中间多余出来的点单独生成。
结合图6所示本发明方法实施例的步骤示意,以下阐述两点-对称方法的主要技术特点,把坐标空间的四个象限按照斜率2(1/2)划分为16个卦限,在某卦限内直线的点阵仅有三种情况(如步骤601所示);在直线始端,可以通过模式判断(比较)来一次生成两个像素点,也即在始端可以根据始端侧当前点一次生成两个始端后趋像素点(如步骤602所示);再按照同趋规则,在直线终端侧对称地得到终端当前像素点的两个后趋像素点(如步骤603所示)。
由二维坐标平面坐标的对称性可以知道,解决了直线斜率在区间
中的直线生成问题,就解决了所有斜率的直线在整个坐标平面的生成问题。
请参阅之前的图2A和图2B,两图示出了在斜率区间
中直线的生成过程中对点的选择情况。其中Pi-1表示当前已经选定的离直线最近的像素,Pi-1的后续第一个点要选择Ti或Si,如果s>=t,Ti较Si更靠近直线,则应选择画像素Ti;如果s<t,Si比较靠近直线,应选择画像素Si。Pi-1后续的第二个点要选择Ti+1或Si+1,同样要根据m和n的大小来选择Ti+1或Si+1。
Bresenham算法的核心是计算误差因子的初始值和迭代公式,下面将导出两点Bresenham生成法的误差迭代公式,也就是点的生成判据问题,按照直线斜率在
内,在[1/2,1]内,以及在
之外等情况分别论述。
(一)首先论述直线斜率在区间
中的两点算法。
由图4可知,在斜率区间
中点的排列模式仅有图4中的mode41、mode42和mode43共三种情形,图2B示出了在斜率区间
中点的选择情况,在此情况下设Pi-1是已选定的离直线最近的像素,我们要先计算其后第二个像素是Si+1还是Ti+1,然后再判断其后第一个像素是Si还是Ti。因为若选择了Si+1,那么不用计算一定要选择Si,若选择了Ti+1,那么在下面通过构造一个选择判据C来对Si还是Ti进行选择。
设Pi-1的坐标为(r,q),Si+1的坐标为(r+2,q),Ti+1的坐标为(r+2,q+1),把即将生成的直线(x0,y0)-(x1,y1)简化为(0,0)-(dx,dy),直线方程可表示为式1所示。
代入Si+1和Ti+1的坐标并对理想点的y坐标求差可以得到 (式11) (式12) 由此可得 (式13) 设(m-n)dx=di,因为dx>0,当di<0时m<n,所以应当选择Si+1点,当di>=0时,m>=n,所以应当选择Ti+1点,把r=xi-1、q=yi-1代入上式得 di=2(xi-1·dy-yi-1·dx)+4dy-dx (式14) 所以,可以用i+2代替i(增加2单位步长)得到 di+2=2xi+1·dy-yi+1·dx)+4dy-dx(式15) 从di+2中减去di得到 di+2-di=2dy(xi+1-xi-1)-2dx(yi+1-yi-1) (式16) 因为xi+1-xi-1=2,式16为 di+2=di+4dy-2dx(yi+1-yi-1) (式17) 如果di<0,选点Si+1,则yi+1=yi-1,式17可表示为如下的误差因子迭代公式 di+2=di+4dy(式18) 如果di>=0,选点Ti+1,则yi+1=yi-1+1,式17可表示为如下的误差因子迭代公式 di+2=di+4dy-2dx(式19) (x0,y0)=(0,0)代入式14可以方便地得到di的初值,即d1=4dy-dx。
根据生成的第i个像素时的di值得到di+2的值,从而可以方便地判断出第i+2个像素的选择情况(Ti+1或Si+1)。现在还有一个问题第i+1个像素是选择Ti还是Si。
由图2B可知,在确定第i-1个像素为Pi-1且第i+1个像素选择Si+1时,第i个像素可以直接选择Si,然而在第i+1个像素选择Ti+1时,第i个像素是选择Si还是选择Ti,是需要判断一下的,不妨考虑式13减去式4得到 (m-n)dx-(s-t)dx=2dy=C (式20) 其中,C即为前述的选择判据,式20可变换为 (m-n)dx-2dy=(s-t)dx (式21) 因为dx>0,当(s-t)·dx<0时,s<t,此时第i个像素应该选择Si,(s-t)·dx>=0时要选择Ti。又因为(m-n)·dx=di,由式21可以知道,di<2dy时选择Si,di>=2dy时选择Ti。令C=2dy,可以按照两点法生成的第i个像素时的误差因子di值与C值作一个比较,从而可以方便地判断出第i个像素应该选择Ti还是Si。
由此可知从直线始点开始,使用与Bresenham单点算法一样的流程来生成后趋点,不同的是每次运算步进为2,要生成两个点。在得到直线始端侧当前点位置后,根据上述误差因子迭代公式也即式18和式19来进行误差迭代,步长为2,先判断始端侧当前点后面的第二个点也即当前点第二后趋点的位置,然后再根据式21来判断出始端侧当前点后面的第一个点也即始端侧当前点与当前点第二后趋点中间那一点,称之为当前点第二后趋点的位置,并将当前点第二后趋点作为新的始端侧当前点,以此为基础进行后续判断。
(二)论述完直线斜率在区间
中的两点算法之后,紧接着论述直线斜率在区间[1/2,1]中的两点算法。
在斜率区间[1/2,1]中点的排列模式仅有图4中mode44这一列所示的三种排列模式,图2A表示出了在斜率区间[1/2,1]中对当前点Pi-1来说,后续第一个点Si或Ti,后续第二个点Si+1或Ti+1的选择情况图解。
在图2A中,Pi-1的坐标为(r,q),Si+1的坐标为(r+2,q+1),Ti+1的坐标为(r+2,q+2),Si的坐标为(r+1,q),Ti+1的坐标为(r+1,q+1),由前述内容不难得出对点Si+1和Ti+1的误差因子di,及di+2和di的差值迭代公式,还有对点Si和Ti的选择判据C,以及di的初值,其中 di+2和di的差值迭代公式 di+2=di+4dy-2dx(di<0,选择Si+1点)(式22) di+2=di+4dy-4dx(di>=0,选择Ti+1点) (式23) di的初值 d1=4dy-3dx(式24) 对点Si和Ti的选择判据C,令 di-C=(s-t)dx (式25) 因di=(m-n)dx,所以 C=(m-n)dx-(s-t)dx=2dy-2dx(式26) 因此,当di<C时,(s-t)dx<0,s<t,所以选择Ti点;当di>=C时选择Si点。
(三)论述完直线斜率在区间
和[1/2,1]中的两点算法之后,紧接着论述直线斜率在区间
之外时的两点算法。
当直线斜率在第一象限大于1时,只要把斜率
区间中的判据迭代公式中的dx、dy对换一下即可。
在给定二维坐标平面内其它象限所有直线的生成,均可以通过对称变换,使用斜率在第一象限中的直线生成算法来完成。
前面论述了两点Bresenham算法,在这里加入“对称算法”思想改进之。将“两点法”与“对称算法”结合形成“4点画线算法”。即在直线的始端先用两点法计算生成2个点,然后再利用对称性,不用计算而直接画出终端对称的两个点,这样就可以只用一次计算就生成4个点,其中2个在始点附近、另2个在终点附近。图7表示出了在斜率
中用两点法生成的两个点的所有情况,其中mode71表示了斜率等于1时的情形,mode72表示了斜率小于1时的情形,mode73表示了斜率大于1时的情形,mode74表示了斜率等于0时的情形。图7中空心圆表示当前点,实心圆表示当前点后边的两个后趋点。图8示出了分别与图7所示共4中情形相对称的两个点的情况,其中mode81与mode71相对应,mode82与mode72相对应,mode83与mode73相对应,mode84与mode74相对应。图7表示从始点向终点方向生成,图8表示从终点向始点方向对称生成,图8对称的点可以采用图7中已生成的点按照相反的步进规则,也即前述的同趋规则直接画出。
下面举例说明对称点的画法,例如图7中的mode72,如果当前点的坐标是(x,y),生成的两个后趋点坐标为(x+stepx,y+stepy)、(x+stepx+stepx,y+stepy),根据对称关系,此时当前点的对称点,以及该对称点其两个后趋点分别为(x’,y’)、(x’-stepx,y’-stepy)和(x’-stepx-stepx,y’-stepy)。对称生成的第一个点是线段的终点,不需要计算。那么,这里就有了初始状态和一个确定的迭代、对称关系,可以循环步进生成始端部分、对称的生成终端部分的点,计算量减少到了一半。
直线对称生成还存在的一个问题是直线中间的接头点怎么画?由于每次计算循环可以生成4个点,所以主循环的长度应该是整个线段dx除4取整。如果,dx不是4的整数倍,这时还会剩余1、2或3个点是需要单独生成的,对应的从始点方向生成1、2点,剩余点为3时再对称的生成1点即可。与Bresenham单点算法相比,本发明方法可以将画线效率提高2~3倍。
使用随机数产生器产生100万对直线线段端点,分别用Bresenham单点生成算法与本发明方法进行了直线段生成速度测试,共测10次,取平均值。对随机产生100万对线段端点的时间单独测试,取其平均值,把总的时间减去随机数的产生时间,就是线段的生成时间。线段的生成时间没有包含写像素的时间,测试结果表1所示。测试环境为Pentium 4,x86 Family 6 Mode418 Stepping 3,GenuineIntel,Win2000。可见用单点法生成100万条线段的平均时间是8494-721=7773ms,用本发明方法生成100万条线段的平均时间是3871-721=3150ms,是单点法生成时间的40.5%,加速比为2.468。由于多余的处理计算和不同斜率时的生成速度不同的原因,虽然本发明方法可以一次生成2或4个点,但是加速比没有突破3。表1示出了采用本发明两点对称生成直线的方法与单点生成直线的方法进行测试比较的结果 表1、本发明方法与单点生成方法测试比较结果表 下面通过另一个较具体的实施例来更进一步详细地说明本发明两点对称生成直线的方法。由于对称性,仍然先考虑第一象限斜率
区间中的情况。第一象限斜率
之外的情况,以及其余象限的情况,均可按照第一象限斜率
区间对称获得。设斜率为k=
,关键变量的定义如下 主循环的长度length=(dx-1)>>2,迭代循环计算一次可画出4个点,在直线确定了首尾两点之后,将其余像素点除4取整,得到的结果即为主循环的循环步数,在主循环之内,每次都是根据直线始点这一侧的当前点,也即前述的始端侧当前点,首先得到始端侧当前点的第一后趋点,然后获取始端侧当前点与始端侧第一后趋点之间的那个点,也即前述的始端侧当前点的第二后趋点;再按照同趋原则,以终端当前点为基础,得到终端侧当前点的第一后趋点,以及终端当前点与终端侧第一后趋点之间的终端侧当前点的第二后趋点。
中间接点个数如果直线段所有像素点减去首尾两点,除4之后还有余数extras,那么再针对余数为1、2或3分别进行处理。
当前点后续第一个点的选择判据C值 C=2dy (k<1/2)(式27) C=2dy-2dx (k>=1/2) (式28) 当前点后续第二个点的误差因子di的迭代公式 di+1=di+4dy-2dx (di>=0,k<1/2) (式29) di+1=di+4dy (di<0,k<1/2) (式30) di+1=di+4dy-2dx (di>=0,k>=1/2) (式31) di+1=di+4dy-4dx (di<0,k>=1/2) (式32) di的初值d1 d1=4dy-dx(k<1/2) (式33) d1=4dy-3dx (k>=1/2)(式34) 在斜率大于1时只要把上面迭代变量中dx与dy对换即可,而对应的画点模式则相应的按照图4所示的情况调整,分别是Mode41对应Mode47、Mode42对应Mode45、Mode43对应Mode46,而Mode44不变,替换一下即可。
如果直线再除去首尾两点之后所有的点不能被4整除,那么在主循环结束后,直线的中间有extras个接点需要单独计算,直线的中间接点获取方法具体为,将整除部分始端侧最后一个点作为获取直线中间接点的当前点,在此基础上获取extras个接点,获取方法是根据主循环结束时的误差因子dlength-1与0、选择判据C的关系来判断后续两个点的坐标位置。具体地,extras的值可有三种情况,其中 当extras=1时,根据dlength-1与0的大小关系来确定这个点的位置; 当extras=2时,根据dlength-1与0的大小关系确定直线始端侧距离当前点较近的那个点的位置,根据dlength-1与C的大小关系来确定剩余的那个点,也即距离该当前点较远的那个点的位置; 当extras=3时,采用与上述extras=2时的方法获取当前点的两个后趋点,然后再将离当前点最近的那个后趋点对称到直线终端侧即可。
本发明可以通过无线定位技术和GIS技术的结合,经嵌入式用户终端(手机等)的图形显示系统来告诉用户需要的地理位置图形信息。本发明属于GDI基础图形生成领域,尤其涉及需要快速直线生成的应用。如嵌入式地理信息系统、导航系统中地理图形等基础图形生成系统之中。
应当理解的是,对本发明技术所在领域的普通技术人员来说,可以根据本发明的技术方案及其构思进行相应的等同改变或替换,而所有这些改变或替换,都应属于本发明所附权利要求的保护范围。
权利要求
1、一种两点-对称的直线生成方法,其特征在于
根据直线始端像素点一次生成直线始端侧的两个后趋像素点,其中,距离所述始端像素点较远的后趋点为始端侧第一后趋像素点,所述始端像素点与所述始端侧第一后趋像素点之间的后趋像素点为始端侧第二后趋像素点;
按照同趋规则,根据直线终端像素点,一次生成直线终端侧的两个后趋像素点,其中,距离所述终端像素点较远的后趋点为终端侧第一后趋像素点,所述终端像素点与所述终端侧第一后趋像素点之间的后趋像素点为终端侧第二后趋像素点;
将所述始端侧第一后趋像素点作为始端侧当前的始端像素点,将所述终端侧第一后趋像素点作为终端侧当前的终端像素点,以2个像素单位为步进长度,迭代生成所述直线剩余的像素点。
2、如权利要求1所述的直线生成方法,其特征在于
根据所述始端像素点一次生成所述始端侧的两个后趋像素点,包括将坐标空间的四个象限按照斜率2或1/2划分为16个卦限,通过模式判断一次生成所述始端侧的两个后趋像素点。
3、如权利要求2所述的直线生成方法,其特征在于
所述模式判断所采用的模式种类在每个卦限内是确定的。
4、如权利要求3所述的直线生成方法,其特征在于
所述模式种类在每个卦限内为3种。
5、如权利要求1所述的直线生成方法,其特征在于
如果所述直线在除去所述直线始端像素点和所述直线终端像素点后,剩余的像素点数量用4整除后还有余数,则以所述始端侧最后一次迭代生成的第一后趋像素点作为当前的始端像素点,根据所述直线的斜率,生成所述直线上与所述余数对应的所述始端侧与所述终端侧中间的接点。
6、如权利要求5所述的直线生成方法,其特征在于
所述余数为1,对应的所述接点为1个,以所述始端侧最后一次迭代生成的第一后趋像素点作为当前的始端像素点,根据所述直线的斜率,生成所述接点;
所述余数为2,对应的所述接点为2个,以所述始端侧最后一次迭代生成的第一后趋像素点作为当前的始端像素点,根据所述直线的斜率,首先生成所述接点中距离所述当前的始端像素点较近的那1个接点,然后再生成剩余的那1个接点;及
所述余数为3,对应的所述接点为3个,以所述始端侧最后一次迭代生成的第一后趋像素点作为当前的始端像素点,根据所述直线的斜率,首先生成所述接点中距离所述当前的始端像素点最近的第1个接点,然后再生成距离所述当前的始端像素点次近的第2个接点,最后将所述第1个接点对称到所述终端侧,得到所述接点中剩余的那个接点。
全文摘要
本发明公开了一种两点-对称的直线生成方法,旨在提高图形系统中直线的生成效率,以2个像素单位为步进长度,在直线的始端根据当前起始点一次生成两个后趋像素点,再按照同趋规则,在终端侧也得到两个后趋像素点,一次迭代运算就可以得到直线上的4个像素点,有效提高了直线的生成效率,适用于整个计算机图形学领域。
文档编号G06T11/20GK101408987SQ200710164029
公开日2009年4月15日 申请日期2007年10月12日 优先权日2007年10月12日
发明者党茂昌 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1