(5)直线的生成之Bresenham画线算法

本文详细解析了Bresenham画线算法的基本原理,包括如何通过决策参数选择下一个像素点,以及如何更新这些参数来高效绘制斜率在0到1之间的直线。适用于计算机图形学初学者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本原理:

假设直线斜率k在0~1之间,并且直线上当前已确定的一个像素点为(xk,yk)。则下一步需要在列xk+1上确定扫描线y的值。y值要么不变,要么递增1。


令两个候选像素的y 值与线段上理想y 值的差值分别为d1和d2

则有:

            d1 = y – yk = (k (xk + 1) +b) –yk             (1式)                

            d2 = (yk+1) – y = yk + 1 – (k (xk + 1) +b)      (2式)

            d1– d2 = 2k (xk+ 1) – 2yk + 2b – 1             (3式) 

设直线段的起点为(x1, y1),终点为(x2, y2),则△y = y2 – y1,△x = x2 – x1,k = △y/△x,代入3式得:

                △x(d1–d2)=2△y·xk–2△x·yk + c      (4式)

令dk = △x(d1 – d2),则称dk为画线中第k步的决策参数,dk的符号与d1– d2的符号相同。
c为常量,其值为2△y+△x(2b-1),与像素位置无关,在计算中将被消除。

当dk>0(即d1>d2)时,右上方像素(xk+1,yk+1)更接近理想直线,则取右上方像素;
当dk<0 (即d1<d2)时,正右方像素(xk+1,yk)更接近理想直线,则取正右方像素;
当dk=0 (即d1=d2)时,两个候选像素任取其一,约定取右上方像素(xk+1,yk+1)。

第k+1步的决策参数dk+1可从4式得出:

                 dk+1 = 2△y·xk+1 – 2△x·yk+1 + c        (5式)

由5式减去4式可得:

                  dk+1 – dk = 2△y(xk+1 – xk) – 2△x(yk+1 – yk)

已知xk+1 = xk + 1,得到:dk+1 = dk+ 2△y– 2△x(yk+1 – yk)

若取右上方像素,yk+1 = yk+ 1,则:dk+1 = dk+ 2△y– 2△x
若取正右方像素,yk+1 =yk,则:dk+1 =dk+ 2△y

决策参数dk的初始值问题:

在直线段起点(x1, y1)的第一个决策参数d0可以从4式以及k =△y/△x 计算出:

d0= 2△y·x1 – 2△x·y1 + 2△y + △x·(2b-1)

           = 2△y·x1– 2△x·(k·x1+b) + 2△y + △x·(2b-1)

           = 2△y·x1–2k△x·x1–2b△x + 2△y + 2b△x – △x

           =2△y·x1–2(△y/△x)△x·x1+ 2△y –△x

           =2△y – △x


代码(0<k<1):

void BHLine(int x1,int y1,int x2,int y2,int color){
	int x,y,dx,dy,dk;
	dy=y2-y1;dx=x2-x1;
	dk=2dy-dx;
	y=y1;
	for(x=x1;x<=x2;x++){
		putpixel(x,y,color);
		dk+=2*dy;
		if(dk>0){
			y++;
			dk-=2*dx;
		}		
	}
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值