三种光栅直线算法的比较

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

三种光栅直线算法的比较
[摘要] 本文以DDA算法,中点直线算法和Bresenham直线算法为模型,主要从时空的角度讨论三种算法的优缺点。

并以C语言为工具编制了相应的程序以实现该算法。

[关键词] 光栅化DDA算法中点直线算法Bresenham直线算法
引言
显示器的屏幕由可以发光的像素点组成,从放大的几何位置看,所有这些像素点构成一个矩形的阵列,利用计算机控制各像素点按我们指定的要求发光, 就构成了我们需要的图形。

现实中我们要讨论的图形却常常是用几何参数来描述的,哪些像素点是正好在图形上或最靠近图形,通过这些像素点描绘出相应的几何体的图形。

在点阵图形系统使用中,每建立或修改一幅图形,一般要用数百次甚至数千次直线等其他基本运算。

因此这些算法不仅必须要建立视觉效果比较好的图形,还必须要执行得尽可能地快。

1 算法比较的三个指标
评价一个转换算法的优劣可以通过如下三个方面来进行:
(1) 所显示图形的精度,转换出的点阵图形毕竟只是对原始图形的近似, 有一定的误差, 这个误差的大小可根据实际需要而定。

(2) 算法的时间复杂性, 也就是算法的速度。

(3) 算法的空间复杂性, 即算法运行过程所需要的内存空间的大小。

2 光栅直线算法
光栅显示器可以看作是一个像素的矩阵,在光栅显示器上显示任何一个图形,实际上都是一些具有一种或多种颜色和灰色像素的集合。

由于光栅图形只是近似的实际图形,如何使光栅图形最完美的逼近实际图形,便是光栅图形学要研究的内容。

数字设备画直线是通过画直线两个端点间的各个离散的点来完成。

每个分散的点的位置通过直线方程来计算。

对于光栅显示系统,直线颜色装载在相应象素位置的帧缓存中。

屏幕坐标只能为整数,因此,画点的位置只能近似实际直线上点的位置。

例如计算的点的位置(10.48,20.51)近似为(10,21)。

这样画出的直线会出现锯齿样,在低分辨率的显示系统上尤其明显。

数学上的直线是没有宽度的,是无数个点构成的集合,显然,光栅显示器只能
近似的显示直线。

当我们对直线进行光栅显示时,需要在显示器有限个像素中,确定最佳逼近该直线的一组像素,并且按扫描线顺序,对这些像素进行写操作,这个过程称为用显示器绘制直线或直线的扫描转换,又称光栅化。

由于在一个图形中,可能包含成千上万条直线,所以要求绘制算法应可能的快。

为比较三种光栅直线算法,下面先后介绍三种算法的基本原理与实现方法。

2.1 数值微分法(DDA算法)
DDA是数值微分分析式(digitaldifferentialanalyzer)的缩写,是根据直线增量来产生直线的,DDA算法的本质是用数值方法解微分方程,通过同时对x和y各增加一个小增量,计算下一步的x,y值。

DDA算法具体实现的方法:已知过端点P0 (x0, y0), P1(x1, y1)的直线段
L:y=kx+b
直线斜率为
先考虑|k| ≤1的情形。

在这种情况下,x每增加1,y最多增加1。

即:当x每递增1,y递增k(即直线斜率);
当|k|>1时,必须把x,y地位互换
在这种情况下,y每增加1,x最多增加1。

即:当y每递增1,x递增1/k(即直线斜率倒数);
上面是从左端点开始计算的,若以右端点作为起始点
当|k| ≤1时:取Dx=-1, yi+1=yi-k
当|k|≥1时:取Dy=-1, xi+1=xi-1/k
2.2 中点直线算法
假定直线斜率k在0~1之间,当前像素点为(xp,yp),则下一个像素点有两种可选择点P1(xp+1,yp)或P2(xp+1,yp+1)。

若P1与P2的中点(xp+1,yp+0.5)称为M,Q 为理想直线与x=xp+1垂线的交点。

当M在Q的下方时,则取P2应为下一个像素点;当M在Q的上方时,则取P1为下一个像素点。

这就是中点画线法的基本原理。

图1. 中点画线法每步迭代涉及的像素和中点示意图
下面讨论中点画线法的实现。

过点(x0,y0)、(x1,y1)的直线段L的方程式为F(x, y)=ax+by+c=0,其中,a=y0-y1, b=x1-x0, c=x0y1-x1y0,欲判断中点M在Q点的上方还是下方,只要把M代入F(x,y),并判断它的符号即可。

为此,我们构造判别式: d=F(M)=F(xp+1, yp+0.5)=a(xp+1)+b(yp+0.5)+c
所以:
当d0时,M在L(Q点)上方,取P1为下一个象像素;
当d=0时,选P1或P2均可,约定取P1为下一个象素;
注意到d是xp, yp的线性函数,可采用增量计算,提高运算效率:
若当前像素处于d>=0情况,则取正右方像素P1(xp+1, yp),要判下一个像素位置,应计算d1=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)=d+a,增量为a。

若d<0时,则取右上方像素P2(xp+1, yp+1)。

要判断再下一像素,则要计算d2= F(xp+2,yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b,增量为a+b。

画线从(x0, y0)开始,d的初值d0=F(x0+1, y0+0.5)=F(x0, y0)+a+0.5b,因F(x0, y0)=0,所以d0=a+0.5b。

由于我们使用的只是d的符号,而且d的增量都是整数,只是初始值包含小数。

因此,我们可以用2d代替d来摆脱小数,这样就写出仅包含整数运算的算法程序。

2.3 Bresenham直线算法
算法原理:过各行各列像素中心构造一组虚拟网格线。

按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。

该算法的巧妙之处在于采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列的所求像素。

如图2所示,设直线方程为yi+1=yi+k(xi+1-xi)+k。

假设列坐标像素已经确定为xi,其行坐标为yi。

那么下一个像素的列坐标为xi+1,而行坐标要么为yi,要么递增1为yi+1。

是否增1取决于误差项d的值。

误差项d的初值d0=0,x坐标每增加1,d的值相应递增直线的斜率值k,即d=d+k。

一旦d≥1,就把它减去1,这样保证d在0、1之间。

当d≥0.5时,直线与垂线x=xi+1交点最接近于当前像素(xi,yi)的右上方像素(xi+1,yi+1);而当d<0.5时,更接近于右方像素(xi+1,yi)。

为方便计算,令e=d-0.5,e的初值为-0.5,增量为k。

当e≥0时,取当前像素(xi,yi)的右上方像素(xi+1,yi+1);而当e<0时,取(xi,yi)右方像素(xi+1,yi)。

图2 Bresenham算法所用误差项d
3 三种光栅直线算法的比较
我们就以从(20,20)到(30,50)分别用DDA算法,中点直线算法和Bresenham直
线算法画直线,并运行30000次。

图3DDA算法画线图图4中点算法画线图
图5Bresenham算法画线图
依照图,从三个方面比较三种算法。

(1) 所显示图形的精度。

由于转换出的点阵图形毕竟只是对原始图形的近似,有一定的误差,所以三种算法所显示的图形有所不同。

从图上可以看到DDA算法最靠近原始图象,中点算法和Bresenham比较靠近原始直线。

但DDA算法有一个缺点就是方向性,也即从(0, 0)到(5, 2)画线与从(5,2)到(0, 0)逆方向所画的线略有不同,此时,当用背景色重画以擦去原直线时,可能会留下一些像素点, 使图形画面显得杂乱。

(2) 算法的时间复杂性
时间的复杂性也是算法的速度。

从图上可以看到DDA算法速度最慢,其次中点算法相对比较快,但最快的是Bresenham算法。

在DDA算法中,Δx或Δy要做一次除法,x+Δx或y+Δy又是浮点数的加法,对每个输出像素点坐标还要使用求整函数,因此计算量仍比较大,速度比较慢。

而中点算法中,如果进一步把算法中把2*a改为a+a等等。

那么,这个算法不仅包含整数变量,而且不包含乘除法,适合硬件的实现,更能提高速度。

在直线生成的算法中Bresenham算法是最有效的算法之一。

它是用判断代替四舍五入,不必计算斜率,因此不用做除法,同时它也不用浮点数只用整数,,最后它只做整数加减法和乘2运算,而乘2运算可以用硬件移位实现。

即有利于硬件的实现又节省了时间,提高了运算速度。

(3) 算法的空间复杂性
空间复杂度是对算法所需存储空间的度量。

存储空间既包括算法本身所用指令、常数、变量和输入数据所占空间又包括一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。

根据程序运行时的信息,来比较三种算法所占空间大小。

图6 DDA算法
图7 中点算法
图8 Bresenham算法
图6、7、8分别是三种算法运行之后的信息表。

图上很清楚的表明了三种算法所占的存储空间。

其中DDA算法的文件最大为954k,中点算法和Bresenham 算法仅有763K。

但这三种算法的可利用存储空间都为247K。

从比较的结果来看,这三种算法各有千秋。

我们可以根据自己的实际情况来运用这三种最基本的直线算法,以达到最佳效果。

参考文献:
[1] 孙家广、许隆文编著“计算机图形学”。

清华大学出版社1995
[2] 蔡士杰等译“计算机图形学”电子工业出版社1998
[3] 孙正兴等编著“计算机图形学基础教程”清华大学出版社2004
[4] 金廷赞等编“计算机图形学教程” 高等教育出版社1998
[5] 李春雨主编“计算机图形学理论与实践” 北京航空航天大学出版社2003
[6] Donald Hearn M. Pauline Baker “ Computer Graphics”Prentice-Hall International,IncAlgorithm
作者简介:
李艳丽(1982年3月—) 信阳师范学院计算机与信息技术学院助教,研究方向图像图形,模式识别。

相关文档
最新文档