资源描述
直线的扫描转换
摘要:二维图形在显示输出之前需要进行两个重要的处理步骤,一是图形的扫描转换,二是剪裁。而所谓图形的扫描转换就是在光栅显示器等数字设备上确定一个最佳逼近于图形的像素集,而从图元的参数表示形式(连续表示)转换成点阵表示形式(光栅显示系统刷新时需要的表示形式)的过程。本文重点介绍有关直线段的扫描转换的两种算法:中点算法,Bresenham算法。
关键词:中点算法,Bresenham算法。
1.算法背景:
所谓扫描转换直线段就是计算出落在直线段上或充分靠近它的一串像素,并以此像素集近似代替原连续直线段在屏幕上显示的过程。直线段的宽度为一个像素宽,为了方便,将像素的几何形状看做是中心为网格点(x,y)的圆点,且相互不重叠。
2.算法:
2.1中点算法:
2.1.1算法推演:假设当前像素点为,(0《k《1)。所以当x方向上加1,y方向或加1,或加0.下一个像素点有两个选择点或。若 为和之中点,Q为直线与垂线的交点,当M在Q的下方,说明离直线近,应为下一个像素点;当M在Q的上方,则为下一点。
设直线方程,将M坐标带入方程,构造判式:
当d<0时,M在Q下方,取;
当d>0时,M在Q上方,取;
当d=0时,M在直线上,取。
所以
再计算判别式的递推公式:
当d<0,下一个像素取取;;
此时d的增量为a+b。
当时,下一个像素取,
此时d的增量为a。
其中: ,由于我们只关心d的符号,只用d 的符号作判断,为了只包含整数运算, 可以用2d代替d来摆脱小数,提高效率。
下面计算d的初值,设像素,
2.1.2算法描述:
1)输入直线两端点和;
2)计算初值,,,
3)绘制点(x,y).判断d的符号:
若d<0,则(x,y)更新为(x+1,y+1),d更新为:
。否则(x,y)更新为(x+1,y),d更新为。
2.2 Bresenham算法
2.2.1算法推演:设直线方程为,(k为直线斜率)。下一个像素的横坐标为,而纵坐标要么为,要么为 。d的初值,x每增加1,d的值增加k,即。纵坐标是否增加1取决于d的值。
1)当,就减掉1,保证d在0,1之间。当,直线与垂线交点M最接近于当前像素的右上方像素.
2)当时,交点M最接近像素。
为方便计算,使e=d-0.5,e的初值是-0.5,增量为k。当时,下一个像素取;当,下一个像素取。
即:当0<<0.5,= ,
当0.5<<1,=+1 ,
2.2.2 算法改进:
在上述算法中计算斜率与误差时用到小数和除法,可以用整数以避免除法。由于算法只用到误差的符号可做替换:2*e*dx。
总结:直线段的三种扫描算法:DDA算法,中点算法,Bresenham算法。DDA算法原理简单,实现容易,但是采用浮点数运算影响效率,而中点算法和Bresenham算法比较常见。本文讨论的是斜率0<k<1的情况下直线的扫描,应该改进到普遍情况下,这还需要做更多的工作。
由于自己的编程能力有限,导致很多问题都得不到解决,一直运行不出结果,还要在编程方面花更多的精力。
展开阅读全文