图形学-中点Bresenham算法

  • 原理
  • 代码
  • 例子

原理

由Bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别。

这时直线将平面分成三个区域:对于直线上的点,F(x,y)=0;对于直线上方的点,F(x,y)>0;对于直线下方的点,F(x,y)<0,如下图所示。

首先假设0≤k≤1,由于x是最大位移方向,因此每次在x方向上加1,y方向上或加1 或加0。假定当前点是P(xi,yi),则下一个点在pu(xi+1,yi+1)与pd(xi+1,yi)中选一。以M表示pu和pd的终点即M(xi+1,yi+0.5)。又设Q是理想直线与垂直线x=xi+1的交点。显然,若M在Q的下方,则pu(xi+1,yi+1)离直线近,应取为下一个像素,否则应取Pd(xi+1,yi)。

所以如前所述,欲判断Q在M的上方还是下方,只要把M代入F(x,y),并判断它的符号即可。

如上构造判别式,当di<0时,M在直线下方,故应取Pu。当di>0时,应取正右方的Pd。当di=0时,
两者一样合适,可以随便取一个。
所以现在根据上面的判别式对误差项进行递推
当di<0时,取右上方像素Pu,欲判断再下一个像素应该取那个应计算

此时di的增量为1-k
当di≥0时,取右上方像素Pd,欲判断再下一个像素应该取那个应计算

下面进行di的初值计算。显然直线的第一个像素P(x0,y0)在直线上,因此响应的di的初始值计算如下

但是这其中仍然有小数,由于我们使用的只是di的符号,因此可以用2di△x摆脱小数

这样Bresenham算法的绘图过程如下

Bresenham算法对任意斜率的直线段具有通用性,对于斜率为整且大于1的直线段,只需要交换x和y之间的规则。对于负斜率,除了一个坐标递减而另一个坐标地政外,其余程序是类似的。

代码

void MidBresenhamLine(int x0, int y0, int x1, int y1, int color)
{int dx, dy, d, UpIncre, DownIncre, x, y;if (x0 > x1){x = x1; x1 = x0; x0 = x;y = y1; y1 = y0; y0 = y;}x = x0; y = y0;dx = x1 - x0; dy = y1 - y0;d = dx - 2 * dy;UpIncre = 2 * dx - 2 * dy; DownIncre = -2 * dy;COLORREF c = RGB(250, 250, 250);while (x <= x1){putpixel(x, y, c);x++;if (d < 0){y++;d += UpIncre;}elsed += DownIncre;}
}

例子


图形学-中点Bresenham算法相关推荐

  1. 计算机图形学04:中点Bresenham算法画椭圆

    作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...

  2. 【计算机图形学】基于OpenGL的中点Bresenham算法画直线

    学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...

  3. 计算机图形学-抛物线的中点Bresenham算法

    抛物线 f ( x ) = a x 2 f(x)=ax^2 f(x)=ax2的中点Bresenham算法 语言:matlab 画图:plot 1 抛物线的特征 通常定义抛物线为到一条直线(准线)和直线 ...

  4. 计算机图形学:直线段的生成算法,VS实现数值微分法和中点Bresenham算法

    实验要求: 实现直线段生成的两种方法: 1) 数值微分法 和 2) 中点Bresenham算法.用户用鼠标点击两个点,两个点都确定后,利用直线段的绘制算法绘制两个点之间的一条直线段.本文章仅涉及算法的 ...

  5. 圆的扫描转换-中点Bresenham算法

    圆的扫描转换是在屏幕像素点阵中确定最佳逼近于理想圆的像素点集的过程.圆的绘制可以使用简单方程画圆算法或极坐标画圆算法,但这些算法涉及开方运算或三角运算,效率很低. 仅包含加减运算的顺时针绘制1/8圆的 ...

  6. 计算机图形学--中点椭圆算法原理及代码实现

    目录 椭圆的几何特性: 算法原理: 代码实现: 说明,我们这里讨论的椭圆都是对称轴平行于坐标轴的椭圆,对于其他方程较为复杂的椭圆我们不做讨论. 椭圆的几何特性: 首先我们考虑椭圆的几何特性.椭圆是抽对 ...

  7. 中点Bresenham算法光栅化画椭圆(四分法)

    void Bresenham_Ellipse(CDC *pDC, int ox, int oy, int a, int b)//圆心x,圆心y,横长,纵长 {float d = b*b + a*a*( ...

  8. 计算机图形学直线线型实验报告,计算机图形学实验报告-直线中点bresenham算法的实现资料.doc...

    计算机图形学实验报告-直线中点bresenham算法的实现资料.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.90 积分 计算机图形 ...

  9. 计算机图形学05:中点BH算法对任意斜率的直线扫描转换方法

    作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...

最新文章

  1. Copilot 真会砸了程序员的饭碗?
  2. 《写给大家看的Web设计书(第3版)》即将上市
  3. JVM学习之GC常用算法
  4. new delete malloc free
  5. Objective-C中的@property和@synthesize用法
  6. MAUI中Maui.Graphics.Controls绘制控件
  7. [Java基础]字符流中的编码解码问题
  8. vim 显示行号_Vim给文件加行号,这通惊为天人的操作没sei了!文末天书慎点
  9. 我是怎样刚拿饿了么P7 offer,然后途虎一轮游的
  10. java查找字符串是否有单词_java – 用于搜索单词/字符串是否包含在实...
  11. centos上自动执行脚本执行php文件
  12. mysql 多级主从_mysql主从复制-二级主从
  13. 前端实现行业分类四级联动选择表单
  14. k3 cloud api java_调用K3Cloud webapi
  15. 如何自定义MATLAB神经网络激活函数
  16. 伪标签(Pseudo-Labelling)
  17. 笔记本电脑一直卡在logo界面重启转圈,进U盘PE黑屏
  18. 【Numpy】np.stack()最通俗易懂解释
  19. 不忘初心,不负韶华,17款迈巴赫S400升级20款迈巴赫S680包围
  20. 买卖股票的最佳时机——力扣121题

热门文章

  1. Python操作常用数据库
  2. LaTex中插入花体字母
  3. [日常训练] 太空飞船
  4. 【USB笔记】 USB设备请求USB Device Requests
  5. Lucene 2.0.0下载安装及测试
  6. ubuntu下opencv图像编程
  7. html doctype 作用介绍
  8. Java实现 LeetCode 16 最接近的三数之和
  9. 知名著者结城浩:坚持做一件事而不厌倦,一旦厌倦马上更换目标
  10. 游戏特性构建-YY篇(1)无冬之夜特性设计整理