直线的DDA、Bresenham算法画直线的实验报告
一、实验目的
学会用DDA法,中点法,Bresenham法这三种思想画直线,同时,对画直线的操作有一定的了解。
二、实验原理及内容
1. DDA法的基本思想如下:
已知过端点P0(x0,y0) , P1(x1,y1)的直线段L:y=kx+b ,直线斜率为k=(y1-y0)/x1-x0 ,
从x的左端点x0开始,向x右端点步进。步长=1(个象素),计算相应的y坐标y=kx+b; 取象素点(x, round(y))作为当前点的坐标。
3. Bresenham法的基本思想如下:
过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与 各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。 设直线方程为: y 1 yi k(xi 1 xi) yi k i
其中k=dy/dx。 因为直线的起始点在象素中心,所以误差项d的初值d0=0。
X下标每增加1,d的值相应递增直线的斜率值k,即d=d+k。一旦d≥1,
就把它减去1,这样保证d在0、1之间。
1当d≥0.5时,最接近于当前象素的右上方象素( x i 1 , y i )
而当d<0.5时,更接近于右方象素(x i 1, y i )。
为方便计算,令e=d-0.5,e的初值为-0.5,增量为k。
x i 1 , y i 1)当e≥0时,取当前象素(xi,yi)的右上方象素(;
而当e<0时,更接近于右方象素(x , y )。 i 1i可以改用整数以避免除法。
4.两方法的程序编写及运行结果截图如下:
void CHTView::OnDda()