Bresenham算法的实现思路
条件已知两个点的坐标p1(x0,y0),p2(x1,y1)要求画出这条直线
之后的e代表每次的误差积累,初始值为0,可以计算出斜率为k=dy/dx=(y0-y1)/(x0-x1)
1、x为阶跃步长(直线光栅化) 适用于0<k<1的情况
即x每次增加1,但是y的坐标根据其是靠近该点所处的单元格的距离来决定,如果离上边近则y加1,如果离下边近则还是y
可以知道机器在画每一个点的时候都会有误差,则画出的第一个点的坐标(x0,y0)也相当于是(x0,y0+e),那么可以知道下个点的坐标为红色的p(x0+1,y0+e+k),但是机器在画p点时,如果p点的纵坐标不是整数时,应该进行判断这个点是接近黄点(x0+1,y0+1)还是接近蓝点(x0+1,y0),最后如果接近黄点则e累积k-1,如果接近蓝点则e累积k
在判断条件的两边同乘2得:
那么程序为:
void LineB2(int x0,int y0,int x1,int y1,int color,CDC *p){
int i,x,y,dx,dy;
float k,e;
dx=x1-x0;
dy=y1-y0;
k=(float)dy/dx;
e=-0.5;x=x0;y=y0;
for(i=;i<=dx;i++){
p->SetPixel(x,y,color);
x=x+;
e=e+k;
if(e>=){
y+=;
e=e-;
}
}
}
上面的程序中e使用了多次除法运算,算法效率低。
优化
将上面的k使用dy/dx替换,并且同乘dx后,令ξ=dx*e则:
则程序为:
//在程序中e为上面的ξ
void LineB3(int x0,int y0,int x1,int y1,int color,CDC *p){
int i,x,y,dx,dy;
float e=;
dx=x1-x0;
dy=y1-y0;
e=-0.5;x=x0;y=y0;
for(i=;i<=dx;i++){
p->SetPixel(x,y,color);
x=x+;
if(*(e+dy)>=dx){
y+=;
e=e+dy-dx;
}else{
e=e+dy;
}
}
}
2、y为阶跃步长(直线光栅化) 适用于k>1的情况
同上可以推出:
可以知道机器在画每一个点的时候都会有误差,则画出的第一个点的坐标(x0,y0)也相当于是(x0+e,y0),那么可以知道下个点的坐标为红色的p(x0+e+1/k,y0+1),但是机器在画p点时,如果p点的横坐标不是整数时,应该进行判断这个点是接近右边(x0+1,y0+1)还是接近蓝左边(x0,y0+1),最后如果接近右边则e累积1、k-1,如果接近左边则e累积1/k
优化得:
将上面的k使用dy/dx替换,并且同乘dy后,令ξ=dy*e则:
对于k<-1和-1<=k<=0可以通过对x取相反数来实现(与以上两种情况关于y轴对称)
Bresenham算法的实现思路的更多相关文章
- 直线的中点Bresenham算法的实现
一.实验目的 1.掌握在MFC中搭建图形绘制的基本框架的方法: 2.将直线的中点Bresenham算法转化成可执行代码. 二.实验内容 1. 通过分析具体数据在中点Bresenham算法上的执行过程, ...
- SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)
在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur ...
- 万字长文,以代码的思想去详细讲解yolov3算法的实现原理和训练过程,Visdrone数据集实战训练
以代码的思想去详细讲解yolov3算法的实现原理和训练过程,并教使用visdrone2019数据集和自己制作数据集两种方式去训练自己的pytorch搭建的yolov3模型,吐血整理万字长文,纯属干货 ...
- 图像数据到网格数据-2——改进的SMC算法的实现
概要 本篇接上一篇继续介绍网格生成算法,同时不少内容继承自上篇.上篇介绍了经典的三维图像网格生成算法MarchingCubes,并且基于其思想和三角形表实现了对样例数据的网格构建.本篇继续探讨网格生成 ...
- Bug2算法的实现(RobotBASIC环境中仿真)
移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...
- Canny边缘检测算法的实现
图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...
- java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现
java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...
- 详解Linux内核红黑树算法的实现
转自:https://blog.csdn.net/npy_lp/article/details/7420689 内核源码:linux-2.6.38.8.tar.bz2 关于二叉查找树的概念请参考博文& ...
- 详细MATLAB 中BP神经网络算法的实现
MATLAB 中BP神经网络算法的实现 BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单介绍一下如何用MATLAB编程实现该算法. 具体步骤 这里 ...
随机推荐
- 你不可错过的Java学习资源清单(包含社区、大牛、专栏、书籍等)
学习Java和其他技术的资源其实非常多,但是我们需要取其精华去其糟粕,选择那些最好的,最适合我们的,同时也要由浅入深,先易后难.基于这样的一个标准,我在这里为大家提供一份Java的学习资源清单. 一: ...
- [CXF REST标准实战系列] 一、JAXB xml与javaBean的转换
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1.不认识到犯错,然后得到 ...
- 【Go】获取用户真实的ip地址
原文链接:https://blog.thinkeridea.com/201903/go/get_client_ip.html 用户请求到达提供服务的服务器中间有很多的环节,导致服务获取用户真实的 ip ...
- json数据格式说明
格式说明 json文件由对象(集合).数组.key/value元素组成,可以相互嵌套. 使用大括号包围的是对象,使用中括号包围的是数组,冒号分隔的是元素. 元素的key只能是字符串. 元素的value ...
- 业务开发(六)—— MyBatis框架
0x01.元素内容必须由格式正确的字符数据或标记组成. Caused by: org.apache.ibatis.builder.BuilderException: Error creating do ...
- List<T>集合的Sort自定义排序用法简单解析
List<T>集合的Sort自定义排序用法简单解析: 如下:一系列无序数字,如果想要他们倒序排列,则使用如下代码: 那么如何理解这段代码呢? (x,y)表示相邻的两个对象,如果满足条件:x ...
- 【转载】Asp.Net中使用基于jQuery的javascript前台模版引擎JTemplate
JTemplate是基于jQuery的开源的前端模版引擎,在Jtemplate模板中可以使用if判断.foreach循环.for循环等操作,使用Jtemplate模板优点在于ajax局部刷新界面时候不 ...
- redis/memcached可视化客户端工具TreeNMS
RedisDesktopManager 之前用的redis客户端工具还不错,今天发现一个国产的nosql客户端,还挺方便滴 TreeNMS是一款redis,Memcache可视化客户端工具,采用JAV ...
- Java爬虫框架Jsoup学习记录
Jsoup的作用 当你想获得某网页的内容,可以使用此框架做个爬虫程序,爬某图片网站的图片(先获得图片地址,之后再借助其他工具下载图片)或者是小说网站的小说内容 我使用Jsoup写出的一款小说下载器,小 ...
- JavaScript如何工作:内存管理+如何处理4个常见的内存泄漏
摘要: 作者将自己常用的JavaScript模块分享给大家. 原文:JavaScript如何工作:内存管理+如何处理4个常见的内存泄漏 作者:前端小智 Fundebug经授权转载,版权归原作者所有. ...