bresenham画线算法详解

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

给定两个点起点P1(x1, y1), P2(x2, y2),如何画它们直连的直线呢,即是如何得到上图所示的蓝色的点。假设直线的斜率00,直线在第一象限,Bresenham算法的过程如下:

1.画起点(x1, y1).

2.准备画下一个点,X坐标加1,判断如果达到终点,则完成。否则找下一个点,由图可知要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点。

2.1.如果线段ax+by+c=0与x=x1+1的交点y坐标大于(y+*y+1))/2则选右上那个点

2.2.否则选右下那个点。

3.画点

4.跳回第2步

5.结束

具体的算法如下,原理就是比较目标直线与x+1直线交点的纵坐标,哪个离交点近就去哪个void Bresenhamline(int x0, int y0, int x1, int y1, int color)

{

int x, y, dx, dy;

float k, e;

dx = x1 - x0;

dy = y1 - y0;

k = dy / dx;

e = -0.5;

x = x0;

y = y0;

for (x= x0;x < x1; x++)

{

drawpixel(x, y, color);//这个是画点子函数

e = e + k;

if (e > 0)

{

y++;

e = e - 1;

}

}

}

上述Bresenham算法在计算直线斜率与误差项时用到小数与除法。可以改用整数以避免除法。等式两边同时乘以2*dx,得到2*e*dx = 2*e*dx + 2dy, 2*e*dx = 2*e*dx - 2*dx.由于算法中只用到误差项的符号,因此可作如下替换:2*e*dx.改进的Bresenham画线算法程序:将e统一乘以2*dx即变成了整数的Bresenhan算法了,^_^

void InterBresenhamline (int x0, int y0, int x1, int y1, int color)

{

int dx = x1 - x0;

int dy = y1 - y0;

int dx2 = dx << 1;//乘2

int dy2 = dy << 1;//乘2

int e = -dx;

int x = x0;

int y = y0;

for (x = x0; x < x1; x++)

{

drawpixel (x, y, color);

e=e + dy2;

if (e > 0)

{

y++;

e = e - dx2;

}

}

}

相关文档
最新文档