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