直线段扫描转换算法-Bresenham算法

Bresenham算法的基本思想:

该算法的思想是通过各行、各列像素中心构造一组虚拟网络线,按照直线起点到重点的顺序,计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列像素中与此交点最近的像素。

假设每次x+1,y的递增(减)量为0或1,它取决于实际直线与最近光栅网格点的距离,这个距离的最大误差为0.5.

误差项d的初值d0=0,d = d + k,一旦d>=1,就把它减去1,保证d的相对性,且在0,1之间

改进1:令e=d-0.5

e>0,y方向递增1;e<0,y方向不递增;e=0,可任取上下光栅点显示

e初=-0.5,k=dy/dx;每走一步有e=e+k;if(e>0) then e=e-1

改进2:由于算法中只用到误差项的符号,于是可以用e*2*Δx来替换e

e初=-Δx;每走一步有:e=e+2Δy;if(e>0) then e=e-2Δx

算法步骤:

1、输入直线的两端点p0(x0,y0)和p1(x1,y1)

2、计算初始值Δx,Δy,e=-Δx,x=x0,y=y0

3、绘制点(x,y)

4、e更新为e+2Δy,判断e的符号。若e>0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2Δx;否则(x,y)更新为(x+1,y)

5、当直线没有画完时,重复步骤3和4.否则结束


Bresenham算法:

//drawpixel(x, y, color)表示在点(x,y)处绘制color的像素点 
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(i = 0; i <= dx; i++){
		drawpixel(x, y, color);
		x += 1;
		e += k;
		if(e >= 0){
			y++;
			e = e - 1;
		}
	}
}

改进后的Bresenham算法:

//drawpixel(x, y, color)表示在点(x,y)处绘制color的像素点 
void IntegerBresenhamline(int x0, int y0, int x1, int y1, int color){
	int x, y, dx, dy, e;
	dx = x1 - x0;
	dy = y1 - y0;
	e = -dx;
	x = x0;
	y = y0;
	for(i = 0; i <= dx; i++){
		drawpixel(x, y, color);
		x++;
		e = e + 2 * dy;
		if(e >= 0){
			y++;
			e = e - 2 * dx;
		}
	}
}


  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值