直线的扫描转换摘要:二维图形在显示输出之前需要进行两个重要的处理步骤,一是图形的扫描转换,二是剪裁
而所谓图形的扫描转换就是在光栅显示器等数字设备上确定一个最佳逼近于图形的像素集,而从图元的参数表示形式(连续表示)转换成点阵表示形式(光栅显示系统刷新时需要的表示形式)的过程
本文重点介绍有关直线段的扫描转换的两种算法:中点算法,Bresenham算法
关键词:中点算法,Bresenham算法
算法背景:所谓扫描转换直线段就是计算出落在直线段上或充分靠近它的一串像素,并以此像素集近似代替原连续直线段在屏幕上显示的过程
直线段的宽度为一个像素宽,为了方便,将像素的几何形状看做是中心为网格点(x,y)的圆点,且相互不重叠
1中点算法:2
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
2算法描述:1)输入直线两端点和;2)计算初值,,,3)绘制点(x,y)
判断d的符号:若d<0,则(x,y)更新为(x+1,y+1),d更新为:
否则(x,y)更新为(x+1,y),d更新为
2Bresenham算法2
1算法推演:设直线方程为,(k为直线斜率)
下一个像素的横坐标为,而纵坐标要么为,要么为