标签:
Bresenham画线算法
本来在word中是有右下数的,一编辑在csdn中编辑就没有了。
Bresenham画线算法是由Bresenham提出的一种精确而有效的光栅线生成算法,该算法仅仅使用增量整数计算。另外Bresenham算法还可用于显示圆和其他曲线。图3.8和图3.9给出了绘制线段的屏幕局部。垂直轴表示扫描线位置,水平轴标识像素列。在这个例子中,我们以单位x间隔取样,并且需要确定每次取样时两个可能的像素位置中的哪一个更接近于线路径。从图3.8中的左端点开始,需要确定下一个取样像素位置是(11, 1l)还是(1 1, 12)。类似地,图3.9则给出了像素位置(50,50)为左端点的具有负斜率的线段。此时,需要确定下一个像素位置是((51, 50)还是((51, 49)。为了解决这些问题,Bresenham算法将对整型参数的符号进行检测,整型参数的值正比于两像素与实际线段之间的偏移。
为了说明Bresenham方法,首先考虑斜率小于1的直线的扫描转换过程,沿线路径的像素位置由以单位x间隔的取样来确定。从给定线段的左端点(xo,yo)开始,逐步处理每个后继列(x位置),并在其扫描线y值最接近线段的像素上绘出一点:图3.10显示了这个过程的第k步。假如已经决定要显示的像素在(xk ,yk),那么下一步需要确定在列Xk+1 = Xk+1上绘制哪个像素,是在位置(xk+1 , yk) ,还是位置(xk+1,yk+1)
和
pk的符号与dlower - dupper,的符号相同(因为例子中△x >0),参数c是一常量,其值为2△y + △x (2b-1),它与像素位置无关,且会在循环计算pk时被消除。假如yk处的像素比yk+ 1的像素更接近于线段(即dlower < dupper),那么参数pk是负的。此时,绘制下面的像素;反之,绘制上面的像素。
直线上的坐标会沿x或y方向的单位步长而变化。因此,可以利用递增整数运算得到后继的决策参数值。在k+1步,决策参数可以从等式(3.14)计算得出:3.计算常量△x 、△y 、2△y和2△y-2△x,并得到决策参数的第一个值:
如果pk<0,下一个要绘制的点是(xk+1,yk+1),并且
那么初始决策参数数的值为
计算后续决策参数的增量为
图3.12中给出了沿这条线路径生成的像素点。
下列程序中给出了斜率为0 < m < 1.0的Bresenham画线算法的实现。首先将线段的端点像素位置输入程序,然后从左端点到右端点绘制像素。
#include<stdlib.h> #include<math.h> /*Bresenham line-drawing procedure for |m|<1.0. */ void lineBres(int x0,int y0,int xEnd,int yEnd) { int dx = fabs(xEnd - x0),dy = fabs(yEnd - y0); int p = 2*dy - dx; int twoDy = 2*dy, twoDyMinusDx = 2*(dy - dx); int x,y; /*Determine which endpoint to use as start position.*/ if(x0 > xEnd){ x = xEnd; y = yEnd; xEnd = x0; } else{ x = x0; y = y0; } setPixel(x,y); while(x<xEnd){ x++; if(p < 0) p += twoDy; else{ y++; p += twoDyMinusDx; } setPixel(x,y); } }
计算机图形学(二)输出图元_3_画线算法_3_Bresenham画线算法
标签:
原文地址:http://blog.csdn.net/heyuchang666/article/details/51178207