图形学(3)光栅图形学的直线绘制(下)
本模块内容绝大部分是在慕课上看中国农业大学网客时的笔记,因此算作转载,在此鸣谢赵明、李振波两位老师,感谢他们录制该门课程供大家学习!
Bresenham算法
前两种算法把效率提高到了整数加法级别,只讲效率,基本已经可以说是最快了。但是,两者均严重依赖直线方程,那么,有没有算法在保证算法效率的同时能够扩大使用范围,将画线算法适用的范围变得更加广泛呢?(曲线等)——即是下面要介绍的Bresenham算法。
算法思想
Bresenham早在1962年就发表了该算法,该算法结合DDA与中点画线法的优势,它的思路是构造一个由各行各列象素中心构造一组虚拟的网格线,按照直线起点到终点的顺序,计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列像素中与此交点最近的像素。
假设按照如下图的方向步进、判断,x每次++,y是否递增取决于直线与最近像素点中心的距离,也即以0.5为界,与d=d+k比较,判断直线具体在哪个像素点内。另外,一旦d>=1,就执行d-=1操作,以保证d的相对性,使它在0,1之间
基于该算法的改进
改进1
改进2
改进后的算法步骤
- 读取两点坐标
- 计算初始值△x=x2-x1,△y=y2-y1,e=-△x,x=x1,y=y1......依然假设x2>x1,在实际编程中需要判断一下
- 绘制点(x,y)
- e+=2*△y,判断e的正负决定要描的像素点
- 循环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)光栅图形学的直线绘制(下)相关推荐
- 图形学(2)光栅图形学的直线绘制(上)
本模块内容绝大部分是在慕课上看中国农业大学网客时的笔记,因此算作转载,在此鸣谢赵明.李振波两位老师,感谢他们录制该门课程供大家学习! 光栅图形学 为适应光栅显示器,需发展一套和他相适应的算法来处理.显 ...
- 光栅图形学-画直线经典算法
光栅图形学算法-画直线算法 如果对这些算法感兴趣,可以去查阅算法的详细介绍,这里只是用伪代码来描述这些算法. 1.DDA算法 DDA算法依赖于直线的斜截式方程 n=x2 - x1; //像素点个数k ...
- line划线计算机图像学,【计算机图形学】根本图形元素:直线的生成算法
[计算机图形学]基本图形元素:直线的生成算法 08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net ...
- 图形学日记(一)光栅图形学
本文主要是概念的总结,并不会讲述具体的算法,如需查看详细内容,请点击相关博客. 1.基础概念: 光栅化(图形的扫描转换):确定最佳逼近图形的像素集合,并用指定属性写像素的过程. 一维图形的表示:在不考 ...
- 计算机图形学算法【1】——直线画法(数值微分法)
计算机图形学算法[1]--直线画法(数值微分法) 以下所有代码均在VS2010下的MFC框架下使用 DDA(数值微分法)介绍 一.基本原理 通过计算直线的斜率k和截距b,y = kx+b 1.计算起点 ...
- 计算机图形学 第四章 光栅图形学
第四章 光栅图形学 计算机图形学 第四章 光栅图形学的相关内容,包括:直线段的扫描转换算法.圆弧的扫描转换算法.多边形区域填充.字符的生成.裁剪.反走样 等 Def 光栅显示器:一个像素矩阵(因此,要 ...
- 【XJTUSE计算机图形学】第二章 光栅图形学(1)
文章目录 [XJTUSE计算机图形学]第二章 光栅图形学(1) 1.基本概念 2.直线段的扫描转换算法 数值微分(DDA)法 增量算法 中点画线法[重点] Bresenham算法[重点 很有可能会考] ...
- 光栅图形学算法基础其二 (裁剪算法)
光栅图形学算法的研究内容 直线段的扫描转换算法 多边形的扫描转换与区域填充算法 直线裁剪算法 反走样算法 消隐算法 一.裁剪简述 使用计算机处理图形信息时,计算机内部存储的图 ...
- 计算机图形学 实验7 《复杂图形绘制-Bezier曲线与Hermite曲线》
计算机图形学 实验7 <复杂图形绘制-Bezier曲线与Hermite曲线> 一.实验目的 学习样条曲线的绘制. 二.实验内容 1.绘制Bezier曲线: 2.绘制Hermite曲线. 三 ...
最新文章
- win7系统升服务器版本,WIN7专业版可update补丁,WIN7旗舰版无法update补丁,WSUS服务器是按windows类型还是版本区别updata的还是其他什么方式...
- python下载百度云盘中的数据_python爬虫:爬取百度云盘资料,保存下载地址、链接标题、链接详情...
- 51nod 1103 N的倍数 思路:抽屉原理+前缀和
- 使用Apache Camel通过soap添加WS-Security
- 防御sql和xss的php代码,PHP防XSS 防SQL注入的代码
- 算法63----丑数【动态规划】
- 常用的JavaScript工具类库收藏
- HTTPS原理与流程
- 虚拟化未来是I don’t care
- 统计系统中所有进程占用内存的方法
- c#使用类库nthereum在.net上开发以太坊的实战示例
- 摄像头(Camera)图像测试(以Imatest为主要工具)V1.0
- Java并发之-队列同步器AQS
- RSS工具-Feeddemon(Feedaemon,Feeddaemon)破解2.0出炉了
- ORACLE SQL 优化的若干方法详细
- 极智Coding | 剖析 darknet load_weights 接口
- 7-6,输入厘米,输出英尺英寸
- 《基于Android微博整合客户端的设计与实现》毕业设计论文任务书
- python实现魔方复原_大佬们帮忙看一下,python解三阶魔方有沒有更快的方法
- Http的各种请求方法(详解)