Bresenham直线生成算法详解

这篇具有很好参考价值的文章主要介绍了Bresenham直线生成算法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本思想

        比较从理想直线到位于直线上方的像素的距离t和相邻的位于直线下方的像素的距离s,根据距 离误差项的符号确定与理想直线最近的像素,如下图所示:

bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习
简言之就是判断t和s哪个点距离直线更近

判断 s-t 的大小

        已知当前的像素的中心点坐标为(xi,yi),根据 s-t 的值来判断下一步的点所在位置。详细计算推导过程如下:

 设位于s、t之间直线的坐标(x,y),得到  bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

 bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

  bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习 时,真实的直线y值为:bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习 ,

 bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

 m代表直线的斜率(slope),故,

  在原式两边同时乘上,原式 = bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

 我们的目的是判断 s-t 是大于0的还是小于0的,且由于恒大于0,所以我们可以令

 ,此时  s-t 正负方向一致,可以用来代替 s-t 来判断其大小。由于判断的是正负性,所以一些已知项可以当成常数C来看。

 bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

此时bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

联立两个式子,注意代入 bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习,然后求 bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习 ,结果得到:

bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

 当我们选择直线上方的点的话,那么  ,bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习,此时

bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习 ;

反之 bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

 最终推出以下式子:

bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

此时 bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习 就代表了  的正负性,当  ,代表了 比 大,所以要取上面的一格,即bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习 ; 反之取的格子位置不变,即 bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习 。

接下来看一道例题,来体会一下breseham算法的应用。

例题

bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

首先先画好直线段:

bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

接着通过求 三个变量的值来确定像素的坐标位置:

第一个像素点位置就是起点,即(0,0),

初始的误差值 ,由前面的式子 bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习,令 i = 1

得:

 bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

所以得值  =  = -1。

综上第一个点,三个参数是。

第二个点,x一定往右一格,所以此时。

因为上一格求得的误差,所以此时 bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习,即。

由于,故 bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

综上第二个点,三个参数是。

第三个点,x一定往右一格,所以此时。

因为上一格求得的误差,所以此时 bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习,即。

由于,故 bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

综上第三个点,三个参数是。

依次类推······

结果如图:

bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

 得到的坐标依次为(0,0) (1,0) (2,1) (3,1) (4,2) (5,2)

根据坐标填充像素:

bresenham算法画直线,计算机图形学,算法,计算机视觉,图形渲染,c++,学习

 此时,breseham算法生成直线像素已完成。

代码描述(C语言伪代码)

//Bresenham
void Bes_line(int x0,int y0,int x1,int y1){
	int dx,dy,h,x,y;
	dx=abs(x0-x1);
	dy=abs(y0-y1);
	h=2*dy-dx;
	x=x0;
	y=y0;

	glColor3f(1.0, 0.0, 0.0);
    glBegin(GL_POINTS);  
    glVertex2f(x,y);	
	while (x<x1)
	{
		if(h<0)  h+=2*dy;
		else{
			h=+2*(dy-dx);
			y++;
		}
		glVertex2f(x,y);		
		x++;
	}
	glEnd();
}

Bresenham算法的优点

  • 不用计算斜率,不涉及到浮点数的运算。 

  • 计算中涉及到的全部是整数文章来源地址https://www.toymoban.com/news/detail-521177.html

  • 乘法运算只有乘以2,可以用移位运算来实现。

到了这里,关于Bresenham直线生成算法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++的MFC实现Bresenham算法画直线,从菜单和鼠标响应开始包含代码的完整良心教程

    首先在菜单栏中加入这个工具 然后给他一个ID,注意要全大写   在类视图中右键你的view,选择属性   在消息栏添加鼠标消息,此时会自动添加一个空函数体。    在事件栏添加鼠标事件,为按下菜单栏按钮的时候添加要做的事情。此时也会生成一个空函数体叫做void CMFCApp

    2024年02月06日
    浏览(32)
  • 【计算机图形学】作业:Bresenham 法绘制圆

    请采用 Bresenham 法绘制圆(共 30 分)。要求: (1) 给出算法的文字描述(共 15 分)。 (2) 编写函数,在给定圆心坐标和半径的情况下,计算出圆 上所有的点,并将这些点存储在数组中(共 15 分)。 输入圆的圆心(xc,yc),半径r。数组circlepoints为输出,保存圆上所有点。 初

    2024年01月24日
    浏览(37)
  • 计算机图形学06:中点Bresenham画圆(并填充边界,例如:边界用红色,内部用绿色填充)

    作者 :非妃是公主 专栏 :《计算机图形学》 博客地址 :https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 专栏名称 专栏地址 软件工程 专栏——软件工程 计算机图形学 专栏——计算机图形学 操作系统 专栏——操作系统 软件测试 专

    2024年01月24日
    浏览(31)
  • 【计算机图形学|直线生成算法】中点画线法

    中点画线法(Midpoint Line Algorithm)是一种画线(Line Drawing)算法,用来在计算机屏幕上绘制线条。 它的基本思想是从线段的起点和终点出发,按照一定的规则向终点逐步逼近,并在途中以控制变量的方式得出每个像素点的坐标,从而绘制出所需的线条。 具体实现中,中点画线

    2024年02月04日
    浏览(36)
  • Bresenham 贝汉明算法

    理解:给定两个点,画出两个点的连线经过的栅格。 求解思路: 1. bresenham贝汉明算法_Bimme军的博客-CSDN博客 2. 若干计算机图形学算法实现_JulyThirteenth的博客-CSDN博客 算法理解 我们首先找到当前栅格的下一个 x 和 y 方向的栅格 1 和 2 ; 计算下 1 和 2 距离开始节点的 x 向 和

    2024年02月10日
    浏览(23)
  • 【已解决】Python Bresenham 3D算法

    放一段使用Python实现Bresenham 3D 算法的代码,并通过Matplot可视化

    2024年02月03日
    浏览(32)
  • 【图形学】探秘图形学奥秘:DDA与Bresenham算法的解密与实战

    ​ 🌈个人主页: Sarapines Programmer 🔥 系列专栏: 《图形学 | 图像解码》 ⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 ​ 目录 🌌1. 初识模式识别 🌌2. 开发环境的使用及基本图形生成 🌍2.1 开发环境及实现 🌍2.2 实验目的 🌍2

    2024年01月21日
    浏览(35)
  • (02)Cartographer源码无死角解析-(46) 2D栅格地图→RayToPixelMask()与贝汉明(Bresenham)算法

    讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885   文末正下方中心提供了本人 联系方式, 点击本人照片

    2024年02月08日
    浏览(42)
  • 计算机图形学:直线段裁剪,Cohen-Sutherland算法

    在二维观察中,需要对窗口进行裁剪,即只保留窗口内的图形,去掉窗口外的图形。直线段裁剪即判断直线在窗口内的部分,去除在窗口外的部分(红圈处)。 其基本思想为编码,即对于直线上任一点(x,y),根据其坐标所在的区域,赋予一个4位的二进制码D3D2D1D0。 编码规则如

    2024年02月07日
    浏览(32)
  • 计算机图形学05:中点BH算法对任意斜率的直线扫描转换方法

    作者 :非妃是公主 专栏 :《计算机图形学》 博客地址 :https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 专栏名称 专栏地址 软件工程 专栏——软件工程 计算机图形学 专栏——计算机图形学 操作系统 专栏——操作系统 软件测试 专

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包