改进DDA:

基于VS2019,调用OPENGL的改进DDA算法,在原来的DDA算法上将划线的部分进行了修改,代码是基于在网上找到的DDA算法进行修改。改掉的部分基本属于文献中直接复制引用。写出来并不费劲,但需要自己进行理解体会。


原理分析:

令 d 表示 y+0.5的小数部分, 因此在区间[0,1)上,小数部分d是以k为增量的单调递增序列;而k>0,则d在经 过一定次数的递增后必然会有d≥ 1,此时 只要令d=d-1,d必然会重新变成区间[0,1) 上的实数。通过以上分析, 可以将直线划分为m 段:L0 ,L1 ,L2…L m-1;每一段上像素点的y+0.5的小数部分 d 都是区间[0,1)上的单调递增序列。因此只要绘制出小数为 di 时候的像素 点然后通过水平移动即可得到多个像素点。
例:绘制(0,0) (10,2)的直线 该直线的斜率为0.2
从表 1 中可看出,根据小数的变化规律 可将该直线分为 3 段分别绘制。 d 有 3 个单调递增的序列,分别是{0.5, 0.7,0.9},{0.1,0.3,0.5,0.7,0.9},{0.1,0. 3,0.5}。 则可将这 11 个像素点分成 3 段输出。


代码如下,注释掉的部分即最开始的DDA算法

#include<math.h>
#include<gl/glut.h>
#include<iostream>
using namespace std;void myDisplay(void);//调用lineDDA
void setPixel(int x, int y);//在OpenGL中可以用glVertex来实现
int around(const float a);
void ChangeSize(GLsizei w, GLsizei h);
void ddaline(int x0, int y0, int xEnd, int yEnd);void myDisplay(void) {ddaline(50, 50, 150, 70);
}void setPixel(int x, int y) {//用OpenGL自己的函数实现书上的setPixelglPointSize(5.0f);glBegin(GL_POINTS);glVertex2i(x, y);glEnd();glFlush();
}int around(const float a) {return int(a + 0.5);
}//窗口大小改变时调用的登记函数
void ChangeSize(GLsizei w, GLsizei h) {if (h == 0)h = 1;glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(0.0f, 250.0f, 0.0f, 250.0f * h / w, 1.0, -1.0);elseglOrtho(0.0f, 250.0f * w / h, 0.0f, 250.0f, 1.0, -1.0);
}//void lineDDA(int x0, int y0, int xEnd, int yEnd) {//  glPointSize(3.0f);//设置像素点大小
//  int dx = xEnd - x0, dy = yEnd - y0, steps, k;
//  float xIncrement, yIncrement, x = x0, y = y0;
//  if (abs(dx) > abs(dy))//确定步长,谁大就取谁
//      steps = abs(dx);
//  else
//      steps = abs(dy);
//  xIncrement = float(dx) / float(steps);//增量当中有一个会为1,另一个会为斜率k
//  yIncrement = float(dy) / float(steps);
//  setPixel(around(x), around(y));//由于每次都加了小于1的增量,所以需要取整
//  for (k = 0; k < steps; k++) {//      x += xIncrement;
//      y += yIncrement;
//      setPixel(around(x), around(y));
//  }
//}void ddaline(int x0, int y0, int x1, int y1)
{int x = x0, t, m; /* m 为直线的段数 */float k, dx, dy, d;dx = x1 - x0;dy = y1 - y0;k = dy / dx;d = 0.5;for (m = 0;; m++){t = y0 + m;while (d < 1){setPixel(x++, t);d = d + k;if (x > x1) break;}if (x > x1) break;d = d - 1;}
}int main(int argc, char* argv[]) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(200, 200);glutInitWindowSize(400, 400);glutCreateWindow("输入线");glutDisplayFunc(&myDisplay);glutReshapeFunc(ChangeSize);glutMainLoop();return 0;
}}

opengl的配置https://blog.csdn.net/lofone/article/details/103625169?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162071928216780265452111%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162071928216780265452111&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-8-103625169.pc_search_result_cache&utm_term=opengl+VS2019&spm=1018.2226.3001.4187
改进的直线DDA算法_王茂华https://kns.cnki.net/kcms/detail/detail.aspx?dbcode=CJFD&dbname=CJFD2009&filename=ZXLJ200904215&v=2ePGOQYw%25mmd2FGPOAWV4DbCZIVUD%25mmd2BMYHUeU02%25mmd2BbAyy5ponc8BujkXBkT9WXQ7gR6Df7S

计算机图形学上机(一)改进的DDA算法相关推荐

  1. 计算机图形学之生成直线的DDA算法(C#)

    计算机图形学DDA直线算法(C#) 一.直线的生成算法 实质上是一个发现最佳逼近直线的象素系列,并填入彩色数据的过程. 二.DDA算法 一种基于直线的微分方程来生成直线的一种方法. 三.DDA代码程序 ...

  2. java画bezier曲面_计算机图形学上机实验4-实现Bezier曲线和Bezier曲面的绘制

    <计算机图形学上机实验4-实现Bezier曲线和Bezier曲面的绘制>由会员分享,可在线阅读,更多相关<计算机图形学上机实验4-实现Bezier曲线和Bezier曲面的绘制(9页珍 ...

  3. 计算机图形学实验报告 裁剪,计算机图形学-实验报告三-图形裁剪算法

    <计算机图形学-实验报告三-图形裁剪算法>由会员分享,可在线阅读,更多相关<计算机图形学-实验报告三-图形裁剪算法(9页珍藏版)>请在人人文库网上搜索. 1.图形裁剪算法1. ...

  4. 计算机图形学 上机作业,计算机图形学.doc

    <计算机图形学> 教 学 大 纲 (Computer Graphics ) 学分数 3 周学时 3 旧代号:318.034.1,新代号:MATH130023 一.说明: 1. 课程名称:计 ...

  5. 计算机图形学(1)基本图形算法

    计算机图形学--基本图形算法 光栅图形中点的表示 屏幕坐标系在左上角 地址=(Xmax-Xmin)[每行像素点数]*(Y-Ymin)[行数]+(X-Xmin)[行中位置]+基地址 直线扫描转换算法 假 ...

  6. 计算机图形学中消隐的相关概念及算法

    本文整理自西安交通大学软件学院祝继华老师的计算机图形学课件,请勿转载 文章目录 基本概念 提高消隐算法效率的常见方法 利用连贯性 包围盒技术 背面剔除 空间分割技术 物体分层表示 消隐的分类 按消隐对 ...

  7. 计算机图形学上机报告绘制圆,计算机图形学上机实验报告

    实验一:基本图形的绘制 一.实验目的与要求 (1)理解glut程序框架: (2)理解窗口到视区的变换 ; (3)理解OpenGL实现动画的原理: (4)添加代码实现中点Bresenham算法画直线: ...

  8. 计算机图形学上机实验之DDV算法

    #include <gl/glut.h>//实用工具包 #include<math.h> #include<stdio.h> #include<windows ...

  9. 计算机图形学(三种画线算法)

    第二章:光栅图形学算法 1.光栅显示器:光栅扫描式图形显示器简称光栅显示器,是画点设备,可看作是一个点阵单元发生器,并可控制每个点阵单元的亮度 2.由来:随着光栅显示器的出现,为了在计算机上处理.显示 ...

  10. 计算机图形学画图形,计算机图形学(三种画线算法)(示例代码)

    第二章:光栅图形学算法 1.光栅显示器:光栅扫描式图形显示器简称光栅显示器,是画点设备,可看作是一个点阵单元发生器,并可控制每个点阵单元的亮度 2.由来:随着光栅显示器的出现,为了在计算机上处理.显示 ...

最新文章

  1. 百度android 测试平台,集成百度活体检测(Android、iOS)
  2. 手把手带你使用JS-SDK自定义微信分享效果
  3. Elasticearch 安装 基础介绍 (一)
  4. UA MATH571B 试验设计 QE练习题 不使用代码分析试验结果I
  5. hihoCoder 1227 2015 北京网络赛 A题
  6. Vue中message.split().reverse().join()函数用法
  7. winfrom的DataGridView控件选中行的DataGridViewLinkColumn列字体颜色的改变
  8. 怎么设置竖线分栏_做出专业级的Word文档分栏,只需这3个技巧
  9. 虎牙直播源解析【可选清晰度】
  10. 边缘检测——Roberts算子
  11. linux 删除开机密码,6种清除开机密码方法,总有一个适合你
  12. 开展922绿色出行活动 加强城市绿色交通安全管理
  13. Google Maps基站定位
  14. python 中控考勤机实时接收多个考勤机的数据
  15. Python3 os.mkfifo() 方法、Python3 os.removedirs() 方法
  16. 每天一学设计模式(一、单一职责原则)
  17. MySQL: 垂直分片
  18. python 网络唤醒电脑WOL
  19. 从傅里叶级数到小波变换——step1.复数域的重要结论(柯西—黎曼条件)
  20. 周鸿祎:微创新要极端一点

热门文章

  1. 应用搬家/应用迁移:c盘搬家哪个软件好?
  2. python爬取金庸小说全集
  3. 更新visual studio 报错The dependent package of ‘Microsoft.Net.PackageGroup.4.6.Redist‘
  4. 八十九、Java内置函数(常用函数)
  5. fruit loops studio音乐宿主软件daw水果软件20.9中文版
  6. 最全企业级数仓建设迭代版
  7. 【FLY】C语言知识点总结
  8. jquery mini下载_【芒果tv湖南卫视直播】-芒果TV播放器下载v6.3.4 官方正式版
  9. 这届年轻人为什么都不爱看电视了?
  10. Matlab画图常用的指令是啥,matlab画图常用命令