假设直线斜率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式)
第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)
在直线段起点(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;
}
}
}
本文详细解析了Bresenham画线算法的基本原理,包括如何通过决策参数选择下一个像素点,以及如何更新这些参数来高效绘制斜率在0到1之间的直线。适用于计算机图形学初学者。
1万+

被折叠的 条评论
为什么被折叠?



