计算机图形学学习笔记(4.1)画线算法

前言

现在的显示器都是像素点阵。但是图形在计算机中都用连续的线段或多边形等存储。因此在显示出来之前,要进行光栅化处理。

图形的光栅化(图形的扫描转换)分成两步:

1)根据图形的定义 在点阵单元上确定最佳逼近 于图形的像素集;

2)给像素指定合适 的颜色值。

如下图,对于一个三角形进行光栅化:

4.1 画线算法

直线是最基本的图形,一个动画或真实感图形往往需要调用成千上万次画线程序,因此直线算法的好坏与效率将直接影响图形的质量和显示速度。

对于画线算法,要处理的问题如下:

输入:直线两个端点的座标P0 (x0 ,y0 )和P1 (x1 ,y1 )

输出:最佳逼近这条直线的像素点集

DDA画线算法

       在确定像素点位置时可以利用直线方程 y = kx + b , 根据x点的座标得到y点的座标,但是这样计算会使用到乘法,若是能将乘法运算转换成加法运算,效率就会提高。数值微分DDA(Digital Differential Analyzer)法引进图形学中一个很重要的思想——增量思想。

       假设x0已知,每次沿x轴方向前进一个像素(步长为1),可以计算出相应的y值。因为像素点的座标为整数,所以还要将计算得到的y值进行取整处理,取整的方法是将其加0.5再取整。如下推论可以得到增量公式,它的含义是当前y值等于前一步的y值加上斜率k,k称为增量。

中点画线算法

      中点画线算法不使用直线的斜截式方程,而使用直线的一般式方程F(x, y) = Ax + By + C 。一条直线将平面划分为三个部分:直线上的点、直线上方的点和直线下方的点。中点画线算法每次在x方向上的步长为1,而在y方向上要不要变化需要判断。其中判断方法是取Pu和Pd的中点M,判断M点在Q点的上方还是下方。若M点在Q点的下方,说明Pu点距离直线更近,所以选择Pu点;若M点在Q点的上方,说明Pd点距离直线更近,所以选择Pd点;若M点正好位于Q点处,则选择Pu和Pd都可以。

 

根据以上算法很容易知道要求的下一个像素点的座标需要进行一次乘法运算和四次加法运算:di = A(Xi + 1) + B(Yi + 0.5) + C,其效率是很低的,因此这里也引入增量的思想求di。

 

Bresenham算法

Bresenham算法并不依赖于直线方程,它提供了一个更一般的算法,该算法不仅有好的效率,而且有更广泛的适用范围。该算法的基本思想是通过各行、各列像素中心构造一组虚拟的网格线,按照直线起点到终点的顺序,计算直线与各垂直网格线的交点,然后根据误差项的符号确定该像素中与此交点最近的像素。该算法中增量 d = k ,且当d > 1时就将其减一,以保证算法的连续性。

将Bresenham算法进行一些改进:

经过改进2之后,就只需要用到整数加减法了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章