(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;
}
}
}
假设直线斜率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;
}
}
}
相关文章推荐
- 生成直线的Bresenham算法
- 光栅直线生成算法
- 计算机图形学(2)基本图形的生成与显示——直线的生成
- 机械版CG 实验2 直线生成算法的实现
- 【原创】基本图形生成:直线篇
- 计算机图形学——直线生成算法
- 直线生成算法
- 直线生成算法---DDA
- 直线生成算法---逐点比较法
- 计算机图形学——生成直线的DDA算法
- 计算机图形学基础 : 基本图形生成算法之直线的扫描转换
- 算法系列之十:直线生成算法 .
- 直线生成算法---中点画线法
- 生成直线的DDA算法
- DDA,中点算法生成直线
- 实验2 直线生成算法实现
- 计算机图形学—DDA直线生成算法
- 【计算机图形学】基本图形元素:直线的生成算法
- 生成直线的Bresenham算法
- 【Computer Graphics】2.直线生成算法(中点画线 算法)