您的位置:首页 > 其它

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

2016-12-30 22:58 253 查看
基本原理:
假设直线斜率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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: