Bresenham’s algorithm( 布兰森汉姆算法)画直线
简介
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( 布兰森汉姆算法)画直线相关推荐
- [TinyRenderer] Lesson 1 布兰森汉姆绘制线算法
文章目录 翻译 1 第一次尝试 2 第二次尝试 3 第三次尝试 4 第四次尝试 5 第四次尝试+ 6 第五次和最后一次尝试 7 线框渲染 实操效果 翻译 布兰森汉姆绘制线算法 1 第一次尝试 第一课的 ...
- 易懂的Bresenham 布雷森汉姆算法画圆的原理与Python编程实现教程
Bresenham 布雷森汉姆算法画圆的原理与编程实现教程 注意:Bresenham的圆算法只是中点画圆算法的优化版本.区别在于Bresenham的算法只使用整数算术,而中点画圆法仍需要浮点数.注意: ...
- 布兰森汉姆画圆matlab,bresenham算法画直线
实验一名称:基本图形的生成算法 要求:(1)掌握 DDA 生成线段算法 (2)掌握 Bresenham 生成线段算法 (3)掌握生成圆弧算法 1. 代码 (1) Bresenham 画线算法 v 实验 ...
- 森汉姆算法(AS3)-检测两点之间所经过的节点
为了把A*寻到的路径中一些没必要的节点去掉,可以用到森汉姆算法,如果两点之间经过的节点都是可走的,那就把这两个点连起来,最终拿到的路径就是比较平滑的了. 下面是算法实现: ? public stati ...
- 在yuv上画线_利用布雷森汉姆算法绘制在YUV图像上画直线
最近,因工作需要,在YUV图像上画直线: 算法1步骤: 1.已知直线的起点和终点: 2. 利用布雷森汉姆算法在两点间画直线: 3. 将该直线上的点的颜色在YUV图像上画出. 布雷森汉姆算法原理参考wi ...
- 计算机图形学E2——OpenGL Bresenham算法画直线
其他计算机图形学实验见 链接 要求 使用Bresemham算法画直线,并且通过鼠标可以实现交互操作 参考代码: 代码1 代码2 代码3(代码好理解) 代码4(讲解很全面) #include<io ...
- 【计算机图形学】基于OpenGL的中点Bresenham算法画直线
学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...
- 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 ...
- Bresenham改进算法结合wu反走样算法画直线
自己打造了CLine画直线类 1.CP2类 定义了点类 class CP2 { public:CRGB clr;double y;double x;CP2();CP2(double,double,CR ...
最新文章
- B2B行业网站10种经营模式研究及组合方案
- kaggle颅内出血比赛分析
- 时间序列研(part1)--随机过程
- Codeforces 1323 div2题解ABC
- 湖北网络安全的产业机遇在哪里
- c mysql对时间加减_25.2.10. 日期和时间值的C API处理
- HTML入门学习笔记(二)
- 苏琴与机器人白正_一段知乎的元白
- 加权最小二乘法matlab,加权最小二乘法matlab
- iPS细胞技术难点以及iPS相关实验材料
- 《互联网周刊》:移动学习在路上
- c语言中感叹号什么意思_感叹号的意思
- MySQL 报错InnoDB: Cannot allocate memory for the buffer poo处理方法
- 淘宝/天猫获取商品历史价格信息 API
- 编程序,用getchar函数读人两个字符给c1和c2,然后分别用
- Leetcode 1564 把箱子放进仓库里1
- [渝粤教育] 西南科技大学 财务管理与分析 在线考试复习资料(3)
- 欧阳修与梅尧臣:逢君伊水畔,一见已开颜
- 史上最牛、最适合自学的尚硅谷《全套Java视频教程》
- matlab做胶州湾地图,惊了,青岛也有了五环地图,快来看你家在几环?