一、直线生成基本思路
图形图像是由屏幕上不同亮度不同颜色的光点(像素)组成。在光栅显示器的荧光屏上生成一个对象,实质上是往帧缓存寄存器的相应单元中填入数据。
所以:对直线进行光栅化的时候,只能在显示器所给定的有限个像素组成的点阵中确定最佳逼近于该直线的一组像素,用这些像素表示该直线。
所以:生成直线的主要工作是:快速找出距离直线最近的网格点,用这些网格点对应的像素表示该直线。
如果我们使用斜截式方程来表示直线,会用到一次乘法和一次 加法,在计算机底层乘法是费时的,那么有什么方法可以改进?
变乘法为加法!
直线是象素集合,生成算法的最终目的,就是为了寻找能更准确逼近直线的象素点。
所以,要确定直线上每个点,那么,如:m<1时,从起始点xs,xs+1, xs+2, xs+3 ……到xe的每个点(xi,yi) ,需要确定其对应的象素值。
所以,每一个(xi,yi)即准确值,都要寻找对应其的象素值(xi,yi,r),即,最接近其准确值的整数值,最简单-取整 。
假设(xi,yi)已经确定了它的对应整数象素点,则下面就要找个规则确定下一个点即(xi+1, yi+1)的对应象素点。
对应于上述情况,即m<1的情况, xi+1=xi+1,即yi+1需要确定,即需要确定上述说的准则,即给定一个判定式,由判定式来确定yi+1的选择。
而判定式为了计算方便也可以有更简便的方式来计算。故判定式也可以由递推式来确定。
二、基本增量算法(DDA)
基本增量算法也叫数字微分算法(Digital Differential Analyzer)
1、基本思想:
舍入法求解最佳逼近;利用微分思想,即每一个点坐标都可以由前一个坐标变化一个增量得到。
2、直线的表示:
设直线的起点坐标为(xs,ys),终点坐标为(xe, ye),
令Δx= xe- xs, Δy= ye-ys,则直线参数方程为
将参数区间[0,1]分为n等分,即t每次增量为 Δt= 1/n
3、提高速度的方法
每一个点坐标都可以由前一个坐标变化一个增量得到。
设(xi,yi)是第i 步得的直线上的点,则直线上第个i+1 点是(xi+1,yi+1),其中
当Δx> Δy>0,即直线斜率小于1,应使x方向每次增加1,y方向最多增加1,此时区Δt=1/Δx;
同理,当Δy>Δx>0,直线斜率大于1,取Δt=1/Δy,所
4、直线的DDA算法程序
void dda(Graphics g, int x1, int x2, int y1, int y2) { int k; //应该走几步 float x, y, dx, dy; //变化的增量 k = Math.abs(x2-x1); if (Math.abs(y2-y1)>k) k = Math.abs(y2-y1); dx = (float)(x2-x1)/k; dy = (float)(y2-y1)/k; x = (float)x1; y = (float)y1; for (int i = 0; i <k ; i++ ) { g.drawLine((int)(x+.5f), (int)(y+.5f), (int)(x+.5f), (int)(y+.5f)); x = x+dx; y = y+dy; } }