【算法研究】Bresenham画线算法

2023-10-27

作者:gnuhpc 
出处:http://www.cnblogs.com/gnuhpc/

 

0.算法目的
这个算法是要画一条平滑的直线,这个工作的难点是确定两点之间的那些像素点,使其近可能的靠近手工绘制的直线。

1.
基本算法描述
现在我们要在一个光栅格子上画一条直线,我们将直线的斜率严格控制在

若我们进一步限定画线的路径:给定一个点后x轴要有一个增量来绘制这条直线的第二个点。这样一来,显而易见若给定点(xy)后,线上的下一个点就只能在有限的范围之内进行选择了:
它可能是画在(x+1,y),或者画在(x1y1)点。
所以我们在平面上转角为45度的位置进行画线,画线也就是在每个步长上决定这两种可能。
我们以下图为说明,注意这是个栅格的局部放大图,你可以想象是用一个高倍放大镜来看:


在点(x,y)处画一个点,那么线的路径一般就会在它本应该绘制成什么样子和屏幕的分辨率实际上允许怎样绘制成什么样子这两个问题上进行折衷。通常点 (x,y)的绘制是错误的,所谓"错误"也就是说在事实上,这些数学意义上的点是无法绘制在像素栅格上的。我们设每个实际绘制点的纵坐标y相对应的误差为 ,那么这些点的数学真值为 。这个误差应该在-0.5到+0.5之间。
在从x移动到x1间,我们对其数学上的y纵坐标也增加了斜率大小的值m。那么,若 ,我们将选择绘制点(x1y)。否则,我们绘制点(x1y1)。其实看看图中的含义,这一步大有四舍五入之感。我们在这一步所作的决定就是在使在屏幕上绘制出来的线和数学上所要画的线之间的总误差最小化。当然前者绘出的图像在局部看来是有些问题的,不过你就忍了吧,这毕竟是机器。
这样,新绘制的点带来的误差我们再次记为 ,这样一来我们就能够在以下的绘制中重复这个过程。新的误差可能采用以下两个可能的值中的一个:若(x+1,y)被选择使用了,那么新的误差就满足 ,反之则新的误差就是 。这个是显而易见的,自己动手画一画就知道了。
写成程序描述一下就是:


这依然需要浮点值,我们现在要做的就是将浮点数转化为整数,那么我们试着做如下运算:


这样一来在这个不等式中出现的变量都成为整数了。
替代 ,我们得到
这就是我们来判断点的绘制所用的不等式了,都是整数运算。
每一步误差的更新也可以写成 的形式:

不等式两边都乘以 ,则得到

写成 的形式则是:



我们重新写一下这个整数版的bresenham算法描述:




这个描述有一下特点:
都是整数运算当然速度上比较好,而且乘以2这个运算可以用左移运算这个为运算,速度上也不错。
我们用C语言描述的方式再写一遍这个算法:

void linev6(Screen &s,

unsigned x1, unsigned y1,

unsigned x2, unsigned y2,

unsigned char colour )

{

int dx = x2 - x1,

dy = y2 - y1,

y = y1,

eps = 0;

 

for ( int x = x1; x <= x2; x++ )

{

s.Plot(x,y,colour);

eps += dy;

if ( (eps <<1)>= dx )

{

y++;

eps -= dx;

}

}

}

作者:gnuhpc 
出处:http://www.cnblogs.com/gnuhpc/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【算法研究】Bresenham画线算法 的相关文章

随机推荐

  • Git忽略规则及.gitignore规则不生效的解决办法

    修改 gitignore发现并未生效 原因是 gitignore只能忽略那些原来没有被track的文件 如果某些文件已经被纳入了版本管理中 则修改 gitignore是无效的 那么解决方法就是先把本地缓存删除 改变成未track状态 然后再
  • [从零学习汇编语言] - 标志寄存器

    文章目录 前言 一 标志寄存器的简介 二 标志位详解 2 1 ZF标志 2 2 PF标志 2 3 SF标志 2 4 CF标志 2 4 1 无符号运算 2 4 2 有符号运算 2 5 OF标志 2 5 1 CF标志及OF标志的区别 2 6 D
  • filename在matlab,matlab中的filename

    2 文件名不要取为 matlab 的一个固有函数 m Matlab 中 m 文件的命名规则 matlab 的 m 文件保存的命名规则 1 文件名命名要用英文字符 第一个字符不能是 matlab 编程中需要调入电脑中的某个文件时采用的语句 m
  • AD中用户帐户属性userAccountControl

    http blog csdn net xjzdr article details 3553246 在打开用户帐户的属性后 单击帐户选项卡 然后选中或清除 帐户选项 对话框中的复选框 则会将数值分配给 UserAccountControl 属
  • android 中SQLiteDatabase的使用

    官方介绍 Android provides full support for SQLite databases Any databases you create will be accessible by name to any class
  • tamcat服务器的项目配置,服务器配置tomcat部署项目

    部署项目首先你需要把你的java web项目打包成war文件 在需要打包的项目上右键 gt 选择 Export 选中 Web 下面的 WAR file 点击 Next 通过 Browse 选择保存路径 点击 Finish 完成即可 然后在服
  • osgEarth的Rex引擎原理分析(一二二)着色器程序的opengl过程

    目标 一二一 中问题208 1 创建着色器程序glCreateProgram 2 创建着色器glCreateShader 如果有多个着色器 比如多个顶点 多个片段着色器 多个情况下只有一个有main函数 2 4三步需要执行多次 3 上传着色
  • 10.Xaml ListBox控件

    1 运行界面 2 运行源码 a Xaml 源码
  • shell执行curl_Linux Shell脚本编程--curl命令详解

    用途说明 curl命令是一个功能强大的网络工具 它能够通过http ftp等方式下载文件 也能够上传文件 其实curl远不止前面所说的那些功能 大家可以通过man curl阅读手册页获取更多的信息 类似的工具还有wget curl命令使用了
  • ubuntu18.04 安装NVIDIA3080ti 显卡驱动及SSH服务和用户添加

    主要参考的这篇博客https blog csdn net weixin 46203866 article details 119425999 spm 1001 2014 3001 55061 显卡驱动下载 下载nvidia驱动程序 RTX
  • PRD 发布报表(2)

    发布报表 发布到bi Server 1 首先启动bi Server 这个在我其他的博文中已经有记述 可以参考 Pentaho学习笔记 bi Server配置 2 然后在PRD中如下图所示 选择发布 注意填写bi Server的账号和密码 选
  • 长篇图解java反射机制及其应用场景

    一 什么是java反射 在java的面向对象编程过程中 通常我们需要先知道一个Class类 然后 new 类名 方式来获取该类的对象 也就是说我们需要在写代码的时候 编译期或者编译期之前 就知道我们要实例化哪一个类 运行哪一个方法 这种通常
  • 中国的官办经济-陈经

    这本书写的不错 从建国到2006年的中国的经济进行了梳理 说明了到底为何中国的经济具有这么大的竞争力 我深深认可其中对于中国人民勤劳 勇敢的描写 经济嘛 就是干活创造价值 中国人民是世界上最勤劳的民族 如果没有走错了 如闭关锁国 一定会跟上
  • Google语法

    目录 Google语法 搜索语法 intitle inurl intext link site filetype related 通配符 注意 快照 cache 举例 Google语法 总结一下平时经常用到的搜索引擎语法 基本都适用于百度搜
  • 项目上传svn 服务器

    1 选中项目右键到 team gt share Project 2 进入到选择界面 选择svn 进入下一个界面 现在可以看到的界面是要选择共享资源的地址了 如果之前已经共享过就会保存在下面了 没有的话我们就自己创建新的资源位置 就是第一个选
  • Blender基础:UV编辑器、UV坐标、UV映射、UV展开

    目录 1 纹理 2 UV编辑器 3 UV坐标 4 UV映射 5 UV展开 6 纹理绘制 7 自动UV展开 8 手动UV展开 9 UV布局调整 10 练习 弯曲文字 1 纹理 纹理Texture 又叫贴图 一般来说 物体的表面不是纯色的 由贴
  • springboot 定时任务(线程配置,并行【同步】、异步等)

    1 定时任务实现方式 SpringBoot自带的Scheduled 可以将它看成一个轻量级的Quartz 而且使用起来比Quartz简单许多 本文主要介绍 执行方式 单线程 串行 多线程 并行 2 创建定时任务 Component Enab
  • 【云原生之Docker实战】使用Docker部署StackEdit在线Markdown编辑器

    云原生之Docker实战 使用Docker部署StackEdit在线Markdown编辑器 一 StackEdit介绍 1 StackEdit简介 2 StackEdit中文版简介 3 StackEdit中文版功能 二 检查本地Docker
  • 关于linux /etc/sysconfig/network中的NOZEROCONF=yes参数

    关于linux etc sysconfig network中的NOZEROCONF yes参数 今天从CSSD Fails to Join the Cluster After Private Network Recovered if ava
  • 【算法研究】Bresenham画线算法

    作者 gnuhpc 出处 http www cnblogs com gnuhpc 0 算法目的这个算法是要画一条平滑的直线 这个工作的难点是确定两点之间的那些像素点 使其近可能的靠近手工绘制的直线 1 基本算法描述现在我们要在一个光栅格子上