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

文章目录

  • 专栏推荐
  • 专栏系列文章
  • 一、问题提出
  • 二、算法原理
  • 三、OpenGL代码实现
  • 四、效果展示
  • the end……

专栏推荐

专栏名称 专栏地址
软件工程 专栏——软件工程
计算机图形学 专栏——计算机图形学
操作系统 专栏——操作系统
软件测试 专栏——软件测试
机器学习 专栏——机器学习
数据库 专栏——数据库
算法 专栏——算法

专栏系列文章

文章名称 文章地址
直线生成算法(DDA算法) 计算机图形学01——DDA算法
中点BH算法绘制直线 计算机图形学02——中点BH算法
改进的中点BH算法 计算机图形学03——改进的中点BH算法
中点Bresenham画椭圆 计算机图形学04——中点BH绘制椭圆
中点BH算法绘制任意斜率直线 计算机图形学05——中点BH算法绘制任意斜率的直线
中点Bresenham画圆 计算机图形学06——中点BH算法画圆
有效边表法的多边形扫描转换 计算机图形学07——有效边表法绘制填充多边形
中点BH算法绘制抛物线 100 x = y 2 100x = y^2 100x=y2 计算机图形学08——中点BH绘制抛物线
二维观察之点的裁剪 计算机图形学09——二维观察之点裁剪
二维观察之线的裁剪 计算机图形学10——二维观察之线裁剪
二维观察之多边形的裁剪 计算机图形学11——二维观察之多边形裁剪
二维图形的几何变换 计算机图形学12——二维图形几何变换
三维图形的几何变换 计算机图形学13——三维图形几何变换
三维图形的投影变换 计算机图形学14——三维图形投影变换

计算机图形学(英语:computer graphics,缩写为CG)是研究计算机在硬件和软件的帮助下创建计算机图形的科学学科,是计算机科学的一个分支领域,主要关注数字合成与操作视觉的图形内容。虽然这个词通常被认为是指三维图形,事实上同时包括了二维图形以及影像处理。


一、问题提出

前几篇文章中已经提到了中点BH算法绘制直线(计算机图形学02:中点BH算法绘制直线、计算机图形学03:改进的中点BH算法)。

但在这两篇文章种,都只讨论了斜率大于 0 小于 1 的情况(即: 0 < = k < = 1 0<=k<=1 0<=k<=1),如果要扩展到任意斜率怎么办呢?

其实也很简单秩序要将斜率分成 4 类,然后分情况讨论即可,具体的算法原理及推导如下。


二、算法原理

将斜率分为4种情况,分别为:

  1. 0 < = k < = 1 0<=k<=1 0<=k<=1
  2. k > = 1 k>=1 k>=1
  3. − 1 < = k < 0 -1<=k<0 −1<=k<0
  4. k < − 1 k<-1 k<−1

然后针对每种情况进行求解,得到d、x和y的更新表达式,如下:

详细推导可见直线的中点Bresenham算法的实现


三、OpenGL代码实现

OpenGL实现如下:

// 中点Bresenham算法绘制直线段(k任意)
void  MidBhline2(int  x0, int  y0, int  x1, int  y1) {int  dx, dy, d, UpIncre, DownIncre, x, y;if (x0 > x1) {                // x0为起始点,x1为终止点x = x1; x1 = x0; x0 = x; y = y1; y1 = y0; y0 = y;}x = x0; y = y0; dx = x1 - x0; dy = y1 - y0; // 0 <= k <= 1if (dy >= 0 && dy < dx) {d = dx - 2 * dy;          // d的初始值UpIncre = 2 * dx - 2 * dy; // 2dx*(1 + k)DownIncre = -2 * dy;        // 2dx(-k)glBegin(GL_POINTS);       // 开始绘制点while (x <= x1) {glVertex2i(x, y);      // 画点x++;                 // 更新xif (d < 0) {           // 根据d的符号更新d和yy++;d += UpIncre;}elsed += DownIncre;}glEnd();                  // 结束绘制点}// k > 1else if (dy >= 0 && dy > dx) {d = - dy + 2 * dx;           // d的初始值UpIncre = 2 * dx;          // 2dx*(1)DownIncre = 2 * dx - 2 * dy;// 2dx*(1-k)glBegin(GL_POINTS);      // 开始绘制点while (x <= x1) {glVertex2i(x, y);      // 画点y++;                 // 更新yif (d < 0) {           // 根据d的符号更新d和xd += UpIncre;}else {x++;d += DownIncre;}}glEnd();}// -1 <= k < 0else if (dy < 0 && dy >= -dx) {d = -dx - 2 * dy;         // d的初始值UpIncre = -2 * dy;         // 2dx*(1)DownIncre = -2 * dx - 2 * dy;// 2dx*(1-k)glBegin(GL_POINTS);         // 开始绘制点while (x <= x1) {glVertex2i(x, y);      // 画点x++;                 // 更新yif (d < 0) {           // 根据d的符号更新d和xd += UpIncre;}else {        y--;d += DownIncre;}}glEnd();}// k < -1else if (dy < 0 && dy < -dx) {d = -2 * dx - dy;          // d的初始值UpIncre = -2 * dx - 2 * dy;    // 2dx*(1)DownIncre = -2 * dx;     // 2dx*(1-k)glBegin(GL_POINTS);         // 开始绘制点while (x <= x1) {glVertex2i(x, y);      // 画点y--;                   // 更新yif (d < 0) {           // 根据d的符号更新d和xx++;d += UpIncre;}else {              d += DownIncre;}}glEnd();}
}

四、效果展示

运行该算法绘制直线后,显示如下:


the end……

中点BH算法对任意斜率的直线扫描转换方法到这里就要结束啦~~到此既是缘分,欢迎您的点赞评论收藏关注我,不迷路,我们下期再见!!

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

  1. 五边形镶嵌计算机程序,计算机图形学代码,五角星与五边形的转换,直线扫描等算法...

    [实例简介] 计算机图形学代码,五角星与五边形的转换,直线扫描的dda算法,中点画线 [实例截图] [核心代码] 325 └── 325 ├── 325.aps ├── 325.clw ├── 325 ...

  2. c语言 绘制任意斜率的直线,绘制任意斜率的直线

    <绘制任意斜率的直线>由会员分享,可在线阅读,更多相关<绘制任意斜率的直线(15页珍藏版)>请在人人文库网上搜索. 1.淮海工学院计算机工程学院 实验报告书 课程名: 计算机图 ...

  3. 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法

    前言 本笔记基于 http://www.icourse163.org/learn/CAU-45006?tid=1001746004#/learn/announce 感谢中国农大 赵明老师的分享~ 现在 ...

  4. 计算机图形学实验二 《绘制任意斜率的直线》

    计算机图形学实验二 <绘制任意斜率的直线> 视频讲解地址 一.Bresenham算法 用视频讲会好点我之前也录过相关视频可以先凑合看 二.设计CLine类 之前也说了C++一个类是由源文件 ...

  5. c语言 绘制任意斜率的直线,计算机图形学 绘制任意斜率的直线(1)

    计算机图形学 绘制任意斜率的直线(1) 本文演示,通过自己编写绘制直线函数(像素点填充),绘制任意斜率的直线. 1)创建CP2类 头文件:p2.h // P2.h: interface for the ...

  6. 计算机图形学实习教程之基本图形的生成(直线DDA算法,直线中点算法,Bresenham画圆算法),利用C#实现,附源码

    环境:Win10+Visual Studio 2022 Community 在本次实验中需要用到上一篇文章实验内容的代码及环境,详情请见:传送门 目录 一.实验目的 二.实验过程 1.生成直线的DDA ...

  7. 计算机图形学椭圆_椭圆算法| 计算机图形学

    计算机图形学椭圆 椭圆的性质 (Properties of ellipse) Ellipse is defined as the locus of a point in a plane which m ...

  8. 计算机图形学E2——OpenGL Bresenham算法画直线

    其他计算机图形学实验见 链接 要求 使用Bresemham算法画直线,并且通过鼠标可以实现交互操作 参考代码: 代码1 代码2 代码3(代码好理解) 代码4(讲解很全面) #include<io ...

  9. 计算机图形学-基本图形生成算法

    基本图形生成算法 图元扫描转换 直线段扫描转换 圆弧扫描转换 实区域填充 图形的剪裁 图形反走样 消隐 光栅化算法 线段光栅化算法     DDA算法 中点Bresenham画线算法 Bresenha ...

最新文章

  1. R6010-abort() has been called,Error openning file ../../modules/highgui/src/cap_ffmpeg_impl.hpp解决方法
  2. 布局欧洲,挺进南美,比特币现金(BCH)再度攻下4个新市场
  3. m行n列最大值和最小值C语言,找数组最值 按如下函数原型编程从键盘输入一个m行n列的二维数...
  4. android 滑动拦截,Android 滑动拦截实例代码解析
  5. Python String 方法详解
  6. CF1009F-Dominant Indices【长链剖分】
  7. 结对开发:电梯调度(2)
  8. 好用的重装系统前使用的windows系统软件名称导出备份工具
  9. python权限管理系统_Django 自定义权限管理系统详解(通过中间件认证)
  10. dhcp服务器批量修改ip租期,dhcp服务器的ip地址租期默认是多久
  11. Nask汇编编写操作系统,自制NaskCode开发环境
  12. FOSRestBundle功能包:使用指南
  13. VB的SP6更新到2021版了,却安装不上?快来看这里
  14. 三峡大学学生选课系统_三峡大学选课系统操作流程
  15. 区块链技术与应用(北大公开课,肖臻)- ETH 反思
  16. 智能推荐系统开发中的十大要素
  17. 你有多久没有体会过“饥饿”的感觉?写在袁隆平仙逝的第7天
  18. 图像处理------图像加噪
  19. VBUS引脚外围电路设计
  20. [ XJTUSE ]JAVA语言进阶知识—— 8.6 多线程

热门文章

  1. 骁龙820A:座舱域控制器介绍
  2. 【微信小程序】如何引入外部字体样式
  3. 从终点出发的思维(博弈论的诡计)
  4. Java String API 常用的String方法详解
  5. 处理setInterval造成的浏览器内存溢出
  6. de/encodeURI(Component)--http%3A%2F%2Fwww.baidu.com%2Fasd%3Fa%3D123
  7. 【数学】固定弦长公式
  8. Linux (centos) 安装anyproxy https手机设备抓包笔记
  9. 极客大学产品经理训练营 解决方案的设计与积累 第6课总结
  10. 外网开发必备软件-划词翻译