简介

1967年,IBM的J.Bresenham提出了Bresenham算法。
    Bresenham算法是在一些约定条件下的最佳逼近。
    Bresenham算法通过前一个像素点提供的信息来判定后一个像素点的位置。
    DDA算法虽也可绘制直线,但该算法中存在类型转换以及除法运算,当需要画大量的直线时,速度慢。而Bresenham算法则只涉及加法和乘法,且乘法是乘2操作,相当于移位,减少了画直线所需的时间。
   

符号说明(Notations)

直线从(x0,y0)开始,到(x1,y1)结束。
   
    假设斜率|m| ≤1。
    从x = x0开始,每次对x轴的值增加1。
    令第i个像素点的坐标为(xi,yi)
    则下一个像素点的坐标只能为(xi + 1,yi)或(xi + 1,yi + 1)

判别标准(Criteria)

当选择下一个要画的点时,选择距离下面交点更近的一个像素点。

    两个候选像素点到交点的距离分别为:
   
    显然: 如果dlower - dupper > 0,则取交点上方的点作为下一个点;如果dlower - dupper < 0,则取交点下面的点作为下一个点;如果dlower - dupper = 0,则可任选一点。

判别条件的计算(Computation of Criteria)

由于m(斜率)的计算是除法运算,为了节约运算时间,我们需要去掉除法运算。不妨把在这里插入图片描述代入上式,再两边同时除以△x。由前面判别条件可以知道,我们所关注的只是dlower - dupper 的符号(正负),而△x的符号肯定为正的,因此,可以作如下处理:
  
    其中:
   
    对于pi,我们可以得出如下结论:
        如果pi > 0,则选择(xi + 1,yi + 1)作为下一点;
        如果pi < 0,则选择(xi + 1,yi)作为下一点;
        如果pi = 0,则随机选一个。

简化计算,递归求Pi

首先,对于p0,我们有:
   
    易知:
   
    如果pi ≤ 0,根据上面结论,选择(xi + 1,yi)作为下一点,则此时yi+1 - yi = 0,因此:


    如果pi ≤ 0,根据上面结论,选择(xi + 1,yi+1)作为下一点,则此时yi+1 - yi = 1,因此:


    通过上面所述,知道了p0以及pi和pi+1的关系,则可以画直线了。

Bresenham总结

画出(x0,y0)
    计算△x,△y,2△y,2△y - 2△x,p0 = 2△y - △x
    如果pi ≤ 0,画出(xi+1,yi+1) = (xi + 1,yi),同时计算pi+1 = pi + 2△y
    如果pi > 0,画出(xi+1,yi+1) = (xi + 1,yi + 1),同时计算pi+1 = pi + 2△y - 2△x
    重复第3步和第4步,直到画完直线。

例如:画出直线(3,4)-(8,7)


————————————————
版权声明:本文为CSDN博主「七月简语」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ShenDW818/article/details/88669209

Bresenham’s algorithm( 布兰森汉姆算法)画直线相关推荐

  1. [TinyRenderer] Lesson 1 布兰森汉姆绘制线算法

    文章目录 翻译 1 第一次尝试 2 第二次尝试 3 第三次尝试 4 第四次尝试 5 第四次尝试+ 6 第五次和最后一次尝试 7 线框渲染 实操效果 翻译 布兰森汉姆绘制线算法 1 第一次尝试 第一课的 ...

  2. 易懂的Bresenham 布雷森汉姆算法画圆的原理与Python编程实现教程

    Bresenham 布雷森汉姆算法画圆的原理与编程实现教程 注意:Bresenham的圆算法只是中点画圆算法的优化版本.区别在于Bresenham的算法只使用整数算术,而中点画圆法仍需要浮点数.注意: ...

  3. 布兰森汉姆画圆matlab,bresenham算法画直线

    实验一名称:基本图形的生成算法 要求:(1)掌握 DDA 生成线段算法 (2)掌握 Bresenham 生成线段算法 (3)掌握生成圆弧算法 1. 代码 (1) Bresenham 画线算法 v 实验 ...

  4. 森汉姆算法(AS3)-检测两点之间所经过的节点

    为了把A*寻到的路径中一些没必要的节点去掉,可以用到森汉姆算法,如果两点之间经过的节点都是可走的,那就把这两个点连起来,最终拿到的路径就是比较平滑的了. 下面是算法实现: ? public stati ...

  5. 在yuv上画线_利用布雷森汉姆算法绘制在YUV图像上画直线

    最近,因工作需要,在YUV图像上画直线: 算法1步骤: 1.已知直线的起点和终点: 2. 利用布雷森汉姆算法在两点间画直线: 3. 将该直线上的点的颜色在YUV图像上画出. 布雷森汉姆算法原理参考wi ...

  6. 计算机图形学E2——OpenGL Bresenham算法画直线

    其他计算机图形学实验见 链接 要求 使用Bresemham算法画直线,并且通过鼠标可以实现交互操作 参考代码: 代码1 代码2 代码3(代码好理解) 代码4(讲解很全面) #include<io ...

  7. 【计算机图形学】基于OpenGL的中点Bresenham算法画直线

    学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...

  8. Bresenham‘s line algorithm 布雷森汉姆直线算法

    1.线性方程 首先我们假设要绘画的直线斜率大于0小于1. 截距式直线方程如下: y=f(x)=mx+by=f(x)=mx+by=f(x)=mx+b 现在我们要从点(x0,y0)(x_0,y_0)(x0 ...

  9. Bresenham改进算法结合wu反走样算法画直线

    自己打造了CLine画直线类 1.CP2类 定义了点类 class CP2 { public:CRGB clr;double y;double x;CP2();CP2(double,double,CR ...

最新文章

  1. B2B行业网站10种经营模式研究及组合方案
  2. kaggle颅内出血比赛分析
  3. 时间序列研(part1)--随机过程
  4. Codeforces 1323 div2题解ABC
  5. 湖北网络安全的产业机遇在哪里
  6. c mysql对时间加减_25.2.10. 日期和时间值的C API处理
  7. HTML入门学习笔记(二)
  8. 苏琴与机器人白正_一段知乎的元白
  9. 加权最小二乘法matlab,加权最小二乘法matlab
  10. iPS细胞技术难点以及iPS相关实验材料
  11. 《互联网周刊》:移动学习在路上
  12. c语言中感叹号什么意思_感叹号的意思
  13. MySQL 报错InnoDB: Cannot allocate memory for the buffer poo处理方法
  14. 淘宝/天猫获取商品历史价格信息 API
  15. 编程序,用getchar函数读人两个字符给c1和c2,然后分别用
  16. Leetcode 1564 把箱子放进仓库里1
  17. [渝粤教育] 西南科技大学 财务管理与分析 在线考试复习资料(3)
  18. 欧阳修与梅尧臣:逢君伊水畔,一见已开颜
  19. 史上最牛、最适合自学的尚硅谷《全套Java视频教程》
  20. matlab做胶州湾地图,惊了,青岛也有了五环地图,快来看你家在几环?

热门文章

  1. 学完css,做了一个csdn导航栏(一步一步做csdn导航栏,内容满满)
  2. 7 种 基本比例尺地形图的分幅和编号的数量关系
  3. java用户登录代码
  4. 南师大C:分鱼问题2(7筐鱼)
  5. 专业计算机学校排名,计算机专业学校排名
  6. 前端小米商城首页简易模仿
  7. 分布式一致性算法:Raft 算法(论文翻译)
  8. SVN 之 拉远程代码 教程 (二)
  9. 一站式电商流程图模板分享
  10. 一个简单的实习生管理系统