当前位置: 首页 > news >正文

Bresenham直线生成算法详解

基本思想

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

简言之就是判断t和s哪个点距离直线更近

判断 s-t 的大小

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

\because 根据此时的像素坐标(xi,yi),得到  s=y-y_{i} , t=y_{i}+1-y

\therefore s-t=y-y_{i}-(y_{i}+1-y)=2y-2y_{i}-1

\because  x_{i}=x_{i+1} 时,真实的直线y值为:y=m\left ( x_{i}+1 \right )+b ,

\therefore 2y-2y_{i}-1=2(mx_{i}+m+b)-2y_{i}-1

\because m代表直线的斜率(slope),故m=\frac{\Delta y}{\Delta x},

\therefore  在原式两边同时乘上\Delta x,原式 = \Delta x(s-t)=2\Delta yx_{i}+2\Delta y+2\Delta xb-2\Delta xy_{i}-\Delta x

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

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

\therefore d_{i}=2\Delta yx_{i}-2\Delta xy_{i}+C

此时d_{i+1}-d_{i}=2\Delta yx_{i+1}-2\Delta xy_{i+1}+C

联立两个式子,求 d_{i+1}-d_{i} ,结果得到:

d_{i+1}-d_{i}=2\Delta y-2\Delta x\left ( y_{i+1}-y_{i} \right )

\because 当我们选择直线上方的点的话,那么 d_{i}>0 ,y_{i+1}-y_{i}=1,此时

d_{i+1}=d_{i}+2(\Delta y-\Delta x) ;

反之 d_{i+1}=d_{i}+2\Delta y

\therefore 最终推出以下式子:

d_{i+1}=\left\{\begin{matrix} d_{i}+2(\Delta y-\Delta x) , d_{i}\geq 0 \\\\ d_{i}+2\Delta y , d_{i}< 0 \end{matrix}\right.

此时 d_{i+1} 就代表了 s-t 的正负性,当 d_{i}\geq 0 ,代表了 比 大,所以要取上面的一格,即y_{i+1}=y_{i}+1 ; 反之取的格子位置不变,即 y_{i+1}=y_{i} 。

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

例题

首先先画好直线段:

接着通过求x,y,d_{i} 三个变量的值来确定像素的坐标位置:

第一个像素点位置就是起点,即(0,0),x_{1}=0,y_{1}=0

初始的误差值d_{1} ,由前面的式子 d_{i}=2\Delta yx_{i}+2\Delta y+2\Delta xb-2\Delta xy_{i}-\Delta x,令 i = 1

得:

 d_{1}=2\Delta yx_{1}+2\Delta y+2\Delta xb-2\Delta xy_{1}-\Delta x=2\Delta yx_{1}+2\Delta y+2\Delta xb-2\Delta x(\frac{\Delta y}{\Delta x})-\Delta x=2\Delta y-\Delta x

所以得值 d_{1} = 2\Delta y-\Delta x = -1。

综上第一个点,三个参数是x_{1}=0,y_{1}=0,d_{1}=-1

第二个点,x一定往右一格,所以此时x_{1}=1

因为上一格求得的误差d_{1}=-1< 0,所以此时 y_{i+1}=y_{i},即y_{2}=0

由于d_{1}< 0,故 d_{2}=d_{i}+2\Delta y=3

综上第二个点,三个参数是x_{2}=1,y_{2}=0,d_{2}=3

第三个点,x一定往右一格,所以此时x_{2}=2

因为上一格求得的误差d_{2}=3> 0,所以此时 y_{i+1}=y_{i}+1,即y_{3}=1

由于d_{2}> 0,故 d_{3}=d_{i}+2(\Delta y-\Delta x)=-3

综上第三个点,三个参数是x_{2}=2,y_{2}=1,d_{3}=-3

依次类推······

结果如图:

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

根据坐标填充像素:

 此时,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算法的优点

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

  • 计算中涉及到的全部是整数

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

相关文章:

  • 化工供应链如何向产业互联网转型,S2B2C供应链电商系统提升企业供应链效率
  • 网络编程概述、网络编程三要素、InetAddress类及端口和协议介绍
  • 《WEB安全渗透测试》(30)RCE漏洞挖掘技巧
  • 记录vue配置跨域不起作用以及一些理解
  • c语言进阶 数组在内存中的存储(下)
  • c语言初阶测评
  • Loss上升,精度却也上升?
  • 【Linux---06】远程登陆 「ssh登陆 | Xshell登陆 | 上传下载文件」
  • 基于阶梯式Tent混沌和模拟退火的樽海鞘群算法
  • 【Linux 基础笔记】(二)
  • 关于gdb调试: 你的问题可能会在这里找到答案
  • J9数字论:什么是Web3.0概念?
  • MediaCodec_Analyze-1-create
  • vue3中<script setup> 和 setup函数的区别
  • c语言进阶 数据的存储(上)
  • @angular/forms 源码解析之双向绑定
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • [译]CSS 居中(Center)方法大合集
  • [译]Python中的类属性与实例属性的区别
  • 【刷算法】从上往下打印二叉树
  • HTTP--网络协议分层,http历史(二)
  • input实现文字超出省略号功能
  • java 多线程基础, 我觉得还是有必要看看的
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Koa2 之文件上传下载
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • PHP 小技巧
  • React系列之 Redux 架构模式
  • Spring Boot MyBatis配置多种数据库
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 将回调地狱按在地上摩擦的Promise
  • 力扣(LeetCode)357
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 使用权重正则化较少模型过拟合
  • 微信小程序设置上一页数据
  • 我看到的前端
  • 移动端解决方案学习记录
  • python最赚钱的4个方向,你最心动的是哪个?
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #微信小程序:微信小程序常见的配置传旨
  • $$$$GB2312-80区位编码表$$$$
  • (poj1.2.1)1970(筛选法模拟)
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (转载)深入super,看Python如何解决钻石继承难题
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • *p++,*(p++),*++p,(*p)++区别?
  • ../depcomp: line 571: exec: g++: not found
  • .“空心村”成因分析及解决对策122344
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @Autowired 与@Resource的区别