本模块内容绝大部分是在慕课上看中国农业大学网客时的笔记,因此算作转载,在此鸣谢赵明、李振波两位老师,感谢他们录制该门课程供大家学习!

Bresenham算法

前两种算法把效率提高到了整数加法级别,只讲效率,基本已经可以说是最快了。但是,两者均严重依赖直线方程,那么,有没有算法在保证算法效率的同时能够扩大使用范围,将画线算法适用的范围变得更加广泛呢?(曲线等)——即是下面要介绍的Bresenham算法。

算法思想

Bresenham早在1962年就发表了该算法,该算法结合DDA与中点画线法的优势,它的思路是构造一个由各行各列象素中心构造一组虚拟的网格线,按照直线起点到终点的顺序,计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列像素中与此交点最近的像素。

假设按照如下图的方向步进、判断,x每次++,y是否递增取决于直线与最近像素点中心的距离,也即以0.5为界,与d=d+k比较,判断直线具体在哪个像素点内。另外,一旦d>=1,就执行d-=1操作,以保证d的相对性,使它在0,1之间

基于该算法的改进

由于前面的算法已经可以把直线绘制效率提高到整数加法级别了,因此虽然这个思路有优势,但如果不把它也提高到相同级别,也还是白搭。下面是对其效率提高的探索。

改进1

令e=d-0.5,这样判断条件就从d与0.5这个浮点数比较,变为了e与0比较大小。
此时e的初值是-0.5,每走一步有e+=k,要保持e不要太大可以有:if(e>0)e-=1      *这里没有用e>0.5作判断条件,也是因为想避免浮点数的出现。理解时可以举个例子试一下,效果跟e>0.5是一样的。

改进2

根据斜率的定义,k=(y2-y1)/(x2-x1),由于现在判断条件不等式的一边是0,因此可以同乘一下把e化为整数,即使用2*e*(x2-x1)替换原来的e,而e初值中的浮点数也一并化为了整数。
*这里根据前面的假设默认x2>x1

改进后的算法步骤

  1. 读取两点坐标
  2. 计算初始值△x=x2-x1,△y=y2-y1,e=-△x,x=x1,y=y1......依然假设x2>x1,在实际编程中需要判断一下
  3. 绘制点(x,y)
  4. e+=2*△y,判断e的正负决定要描的像素点
  5. 循环3,4直到绘制完成

程序如下

public class Bresenham extends JFrame {private int x1 , x2 , y1 , y2 , e;public Bresenham( int x1 , int y1  , int x2 , int y2 ){super();setTitle("Bresham直线绘制算法");setSize(800,600);setVisible(true);this.x1 = x1;this.x2 = x2;this.y1 = y1;this.y2 = y2;bresenhamDrawLine(x1 , y1 , x2 , y2 );}private void bresenhamDrawLine(int x1 , int y1 , int x2 , int y2){if (abs(x2-x1)>abs(y2-y1)){         //按x方向递增if (x1 > x2){int temp = x1;x1 = x2;x2 = temp;temp = y1;y1 = y2;y2 = temp;}e = x1 - x2;drawPixel(x1,y1);for (int i = x1 , j = y1 ; i < x2 ; i++){e += 2*(y2 - y1);if (e > 0){j++;drawPixel(i,j);}else {drawPixel(i,j);}}}else {if (y1 > y2){int temp = y1;y1 = y2;y2 = temp;temp = x1;x1 = x2;x2 = temp;}e = y1 - y2;drawPixel(x1,y1);for (int j = y1 , i = x1 ; j < y2 ; j++){e += 2*(y2 - y1);if (e>0){i++;drawPixel(i,j);}else {drawPixel(i,j);}}}}

通过以上我们可以看出,Bresenham算法并没有去求k,b亦或是A,B,C,仅仅是通过两点坐标去绘制直线,不限定直线方程类型,集合DDA与中点画线法优势,应用更广泛。

小结

读过这三种算法,我们经历了一个算法不断优化,精益求精的过程,领略了图形学的魅力所在。这些算法中所蕴含的思想是值得我们用心揣摩、领悟的,这对于以后的学习会有很大帮助,比如从二维到三维的直线绘制等。
另外,我们可以看得出,算法中永远没有“最优”,只有不断的改进。我们要勤于思考,发散思维,发现算法的不足并思考改进方案。
下面是一些可以大致读得懂的知网论文,笔者只看过一篇,感兴趣大家可以去看一看作为扩展

图形学(3)光栅图形学的直线绘制(下)相关推荐

  1. 图形学(2)光栅图形学的直线绘制(上)

    本模块内容绝大部分是在慕课上看中国农业大学网客时的笔记,因此算作转载,在此鸣谢赵明.李振波两位老师,感谢他们录制该门课程供大家学习! 光栅图形学 为适应光栅显示器,需发展一套和他相适应的算法来处理.显 ...

  2. 光栅图形学-画直线经典算法

    光栅图形学算法-画直线算法 如果对这些算法感兴趣,可以去查阅算法的详细介绍,这里只是用伪代码来描述这些算法. 1.DDA算法 DDA算法依赖于直线的斜截式方程 n=x2 - x1; //像素点个数k ...

  3. line划线计算机图像学,【计算机图形学】根本图形元素:直线的生成算法

    [计算机图形学]基本图形元素:直线的生成算法 08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net ...

  4. 图形学日记(一)光栅图形学

    本文主要是概念的总结,并不会讲述具体的算法,如需查看详细内容,请点击相关博客. 1.基础概念: 光栅化(图形的扫描转换):确定最佳逼近图形的像素集合,并用指定属性写像素的过程. 一维图形的表示:在不考 ...

  5. 计算机图形学算法【1】——直线画法(数值微分法)

    计算机图形学算法[1]--直线画法(数值微分法) 以下所有代码均在VS2010下的MFC框架下使用 DDA(数值微分法)介绍 一.基本原理 通过计算直线的斜率k和截距b,y = kx+b 1.计算起点 ...

  6. 计算机图形学 第四章 光栅图形学

    第四章 光栅图形学 计算机图形学 第四章 光栅图形学的相关内容,包括:直线段的扫描转换算法.圆弧的扫描转换算法.多边形区域填充.字符的生成.裁剪.反走样 等 Def 光栅显示器:一个像素矩阵(因此,要 ...

  7. 【XJTUSE计算机图形学】第二章 光栅图形学(1)

    文章目录 [XJTUSE计算机图形学]第二章 光栅图形学(1) 1.基本概念 2.直线段的扫描转换算法 数值微分(DDA)法 增量算法 中点画线法[重点] Bresenham算法[重点 很有可能会考] ...

  8. 光栅图形学算法基础其二 (裁剪算法)

    光栅图形学算法的研究内容      直线段的扫描转换算法 多边形的扫描转换与区域填充算法 直线裁剪算法 反走样算法 消隐算法 一.裁剪简述         使用计算机处理图形信息时,计算机内部存储的图 ...

  9. 计算机图形学 实验7 《复杂图形绘制-Bezier曲线与Hermite曲线》

    计算机图形学 实验7 <复杂图形绘制-Bezier曲线与Hermite曲线> 一.实验目的 学习样条曲线的绘制. 二.实验内容 1.绘制Bezier曲线: 2.绘制Hermite曲线. 三 ...

最新文章

  1. win7系统升服务器版本,WIN7专业版可update补丁,WIN7旗舰版无法update补丁,WSUS服务器是按windows类型还是版本区别updata的还是其他什么方式...
  2. python下载百度云盘中的数据_python爬虫:爬取百度云盘资料,保存下载地址、链接标题、链接详情...
  3. 51nod 1103 N的倍数 思路:抽屉原理+前缀和
  4. 使用Apache Camel通过soap添加WS-Security
  5. 防御sql和xss的php代码,PHP防XSS 防SQL注入的代码
  6. 算法63----丑数【动态规划】
  7. 常用的JavaScript工具类库收藏
  8. HTTPS原理与流程
  9. 虚拟化未来是I don’t care
  10. 统计系统中所有进程占用内存的方法
  11. c#使用类库nthereum在.net上开发以太坊的实战示例
  12. 摄像头(Camera)图像测试(以Imatest为主要工具)V1.0
  13. Java并发之-队列同步器AQS
  14. RSS工具-Feeddemon(Feedaemon,Feeddaemon)破解2.0出炉了
  15. ORACLE SQL 优化的若干方法详细
  16. 极智Coding | 剖析 darknet load_weights 接口
  17. 7-6,输入厘米,输出英尺英寸
  18. 《基于Android微博整合客户端的设计与实现》毕业设计论文任务书
  19. python实现魔方复原_大佬们帮忙看一下,python解三阶魔方有沒有更快的方法
  20. Http的各种请求方法(详解)

热门文章

  1. 高级linux内核软件工程师
  2. 数据结构程序设计——山东省城际铁路建设建设
  3. 打卡系列-剑指 Offer 62. 圆圈中最后剩下的数字
  4. MFC实现浮点/进制转换计算器
  5. might和could的区别用法_情态动词may与might用法
  6. 同花顺_代码解析_技术指标_O
  7. python中使用virtualenv库创建虚拟环境的问题
  8. linux实现cp拷贝命令的思路和源码
  9. 机顶盒显示该服务器未授权,户户通提示E04该频道未授权的解决办法
  10. 细数抖音电商的7问题