生成直线的Bresenham算法
2012-08-30 13:36
387 查看
从上面介绍的DDA算法可以看到,由于在循环中涉及实型数据的加减运算,因此直线的生成速度较慢。 在生成直线的算法中,Bresenham算法是最有效的算法之一。Bresenham算法是一种基于误差判别式来生成直线的方法。 一、直线Bresenham算法描述: 它也是采用递推步进的办法,令每次最大变化方向的坐标步进一个象素,同时另一个方向的坐标依据误差判别式的符号来决定是否也要步进一个象素。 我们首先讨论m=△y/△x,当0≤m≤1且x1<x2时的Bresenham算法。从DDA直线算法可知这些条件成立时,公式(2-2)、(2-3)可写成:
二、直线Bresenham算法思想之一: 由于显示直线的象素点只能取整数值坐标,可以假设直线上第i个象素点坐标为(xi,yi),它是直线上点(xi,yi)的最佳近似,并且xi=xi(假设m<1),如下图所示。那么,直线上下一个象素点的可能位置是(xi+1,yi)或(xi+1,yi+1)。 由图中可以知道,在x=xi+1处,直线上点的y值是y=m(xi+1)+b,该点离象素点(xi+1,yi)和象素点(xi+1,yi+1)的距离分别是d1和d2:
(1)当此值为正时,d1>d2,说明直线上理论点离(xi+1,yi+1)象素较近,下一个象素点应取(xi+1,yi+1)。 (2)当此值为负时,d1<d2,说明直线上理论点离(xi+1,yi)象素较近,则下一个象素点应取(xi+1,yi)。 (3)当此值为零时,说明直线上理论点离上、下两个象素点的距离相等,取哪个点都行,假设算法规定这种情况下取(xi+1,yi+1)作为下一个象素点。 因此只要利用(d1-d2)的符号就可以决定下一个象素点的选择。为此,我们进一步定义一个新的判别式:
这里△y=y2-y1,m=△y/△x;c=2△y+△x(2b-1)。 下面对式(2-11)作进一步处理,以便得出误差判别递推公式并消除常数c。 将式(2-11)中的下标i改写成i+1,得到:
三、直线Bresenham算法思想之二: 由于象素坐标的整数性,数学点(xi,yi)与所取象素点(xi,yir)间会引起误差(εi),当xi列上已用象素坐标(xi,yir)表示直线上的点(xi,yi),下一直线点B(xi+1,yi+1),是取象素点C(xi+1,yir ),还是D(xi+1,y(i+1)r)呢? 设A为CD边的中点,正确的选择: 若B点在A点上方,选择D点; 否则,选C点。 用误差式描述为:
为了运算中不含实型数,同时不影响不等式的判断,将方程两边同乘一正整数。 令方程两边同乘2·Δx,即d=2·Δx·ε,则: 初始时:
四、直线Bresenham算法实现: 条件:0≤m≤1且x1<x2 1、输入线段的两个端点坐标和画线颜色:x1,y1,x2,y2,color; 2、设置象素坐标初值:x=x1,y=y1; 3、设置初始误差判别值:p=2·Δy-Δx; 4、分别计算:Δx=x2-x1、Δy=y2-y1; 5、循环实现直线的生成: for(x=x1;x<=x2;x++) { putpixel(x,y,color) ; if(p>=0) { y=y+1; p=p+2·(Δy-Δx); } else { p=p+2·Δy; } } 五、直线Bresenham算法完善: 现在我们修正(2-16)公式,以适应对任何方向及任何斜率线段的绘制。如下图所示,线段的方向可分为八种,从原点出发射向八个区。由线段按图中所示的区域位置可决定xi+1和yi+1的变换规律。 容易证明:当线段处于①、④、⑧、⑤区时,以|△x|和|△y|代替前面公式中的△x和△y,当线段处于②、③、⑥、⑦区时,将公式中的|△x|和|△y|对换,则上述两公式仍有效。 在线段起点区分线段方向 六、直线Bresenham算法演示:
七、直线Bresenham算法特点: 由于程序中不含实型数运算,因此速度快、效率高,是一种有效的画线算法。 八、直线Bresenham算法程序:
| ||||||||||||||||||||||||||||||||||||||||||||||
相关文章推荐
- 直线生成算法的实现:分别利用DDA算法、中点Bresenham算法和改进的Bresenham算法扫描转换直线段P1P2
- 生成直线的Bresenham算法
- 直线生成算法---Bresenham算法
- 生成直线的Bresenham算法
- DDA算法和Bresenham算法生成直线
- 直线生成(DDA、中点、Bresenham)算法
- 【Computer Graphics】1.直线生成算法(DDA 算法)
- 生成直线的DDA算法
- 实验二 直线DDA生成算法的GDI实现
- 【CG】Bresenham算法 画直线与圆
- FJoi2017 1月20日模拟赛 直线斯坦纳树(暴力+最小生成树+骗分+人工构造+随机乱搞)
- 算法系列之十:直线生成算法
- 算法系列之十:直线生成算法
- 直线生成算法
- 「图形学」直线扫描——Bresenham算法改进了中点Bresenham算法?
- 【计算机图形学】基本图形元素:直线的生成算法
- 常用直线图形生成算法(一)
- 逐点比较法生成直线,计算机图形学实验。
- 计算机图形学——直线生成算法
- ArcGIS Server ADF开发:直线段缓冲分析(生成10公里缓冲区)