DDA算法,是计算机图形学中一种基于直线的微分方程来生成直线的方法,由于有浮点数运算与取整,该算法不利于硬件实现。

其主要思想是由直线公式y = kx + b推导出来的。

我们已知直线段两个端点P0(x0,y0)和P1(x1,y1),就能求出 k 和 b 。

在k,b均求出的条件下,只要知道一个x值,我们就能计算出一个y值。如果x的步进为1(x每次加1,即x = x +1),那么y的步进就为k+b;同样知道一个y值也能计算出x值,此时y的步进为1,x的步进为(1-b)/k。根据计算出的x值和y值,向下取整,得到坐标(x’,y’),并在(x’,y’)处绘制直线段上的一点。

为进一步简化计算,通常可令b取0,将起点看作(0,0)。设当前点为(xi, yi)则用DDA算法求解(xi+1,yi+1)的计算公式可以概括为:

xi+1 = xi + xStep (1)

yi+1 = yi + yStep (2)

我们一般通过计算 Δx 和 Δy 来确定xStep和yStep:

如果 Δx > Δy ,说明x轴的最大差值大于y轴的最大差值,x轴方向为步进的主方向,xStep = 1,yStep = k;

如果 Δy> Δx,说明y轴的最大差值大于x轴的最大差值,y轴方向为步进的主方向,yStep = 1,xStep = 1 / k。

根据这个公式,就能通过(xi,yi)迭代计算出(xi+1、yi+1),然后在坐标系中绘制计算出的(x,y)坐标点。

C++代码:

C++

#include

#include

#include

//数值微分法

using namespace std;

float xs = 0.0;

float ys = 0.0;

float xe = 0.0;

float ye = 0.0;

void LineDDA(int x0, int y0, int x1, int y1)

{

float x = 0.0;

float y = 0.0;

float m = 0.0;

float dx = x1 - x0;

float dy = y1 - y0;

if (dx != 0)

{

m = dy / dx;

if (m <= 1 && m >= -1)

{

y = y0;

for (x = x0; x <= x1; x++)

{

glVertex2i(x, int(y + 0.5));

y += m;

}

}

if (m>1 || m

{

m = 1 / m;

x = x0;

for (y = y0; y <= y1; y++)

{

glVertex2i(int(x + 0.5), y);

x += m;

}

}

}

else

{

int x = x0;

int y = 0;

y = (y0 <= y1) ? y0 : y1;

int d = fabs((double)(y0 - y1));

while (d >= 0)

{

glVertex2i(x, y);

y++;

d--;

}

}

}

void lineSegment()

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(0.0, 0.0, 0.0);

glBegin(GL_POINTS);

LineDDA(xs, ys, xe, ye);

glEnd();

glFlush();

}

int main(int argc, char *argv[])

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

cout << "输入线段起始和终点坐标(范围为 0 - 500, 0-500,空格隔开四个数):";

cin >> xs >> ys >> xe >> ye;

glutInitWindowPosition(50, 100);

glutInitWindowSize(500, 500);

glutCreateWindow("DDA");

glClearColor(1.0, 1.0, 1.0, 1.0);

glMatrixMode(GL_PROJECTION);

gluOrtho2D(0.0, 500, 0.0, 500.0);

glutDisplayFunc(lineSegment);

glutMainLoop();

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

#include

#include

#include

//数值微分法

usingnamespacestd;

floatxs=0.0;

floatys=0.0;

floatxe=0.0;

floatye=0.0;

voidLineDDA(intx0,inty0,intx1,inty1)

{

floatx=0.0;

floaty=0.0;

floatm=0.0;

floatdx=x1-x0;

floatdy=y1-y0;

if(dx!=0)

{

m=dy/dx;

if(m<=1&&m>=-1)

{

y=y0;

for(x=x0;x<=x1;x++)

{

glVertex2i(x,int(y+0.5));

y+=m;

}

}

if(m>1||m

{

m=1/m;

x=x0;

for(y=y0;y<=y1;y++)

{

glVertex2i(int(x+0.5),y);

x+=m;

}

}

}

else

{

intx=x0;

inty=0;

y=(y0<=y1)?y0:y1;

intd=fabs((double)(y0-y1));

while(d>=0)

{

glVertex2i(x,y);

y++;

d--;

}

}

}

voidlineSegment()

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(0.0,0.0,0.0);

glBegin(GL_POINTS);

LineDDA(xs,ys,xe,ye);

glEnd();

glFlush();

}

intmain(intargc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

cout<

cin>>xs>>ys>>xe>>ye;

glutInitWindowPosition(50,100);

glutInitWindowSize(500,500);

glutCreateWindow("DDA");

glClearColor(1.0,1.0,1.0,1.0);

glMatrixMode(GL_PROJECTION);

gluOrtho2D(0.0,500,0.0,500.0);

glutDisplayFunc(lineSegment);

glutMainLoop();

return0;

}

效果图:

数值微分法绘制直线c语言,OpenGL数值微分法(DDA)画直线相关推荐

  1. 图形学画直线c语言,计算机图形学:3种画直线算法(转)

    //--------------------------------------------------------------------- //绘制直线的DDA算法基本函数 //--------- ...

  2. 计算机直线的绘制实验报告,dda画直线实验报告

    dda画直线实验报告 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 本科实验报告实验名称: DDA直线画法 课程名称: 计算机图形学 ...

  3. 计算机图形学画直线程序豆丁网,计算机图形学DDA生成直线画法程序.doc

    计算机图形学DDA生成直线画法程序 实验一.直线的生成 一.实验目的 掌握DDA直线画法.中点画线法和Bresenham画线法 掌握VC++简单程序设计方法 二.实验内容 根据提供的程序框架,修改部分 ...

  4. C语言编程之用line画直线

    问题描述:学习使用line画直线. 程序源码: #include<graphics.h> void main() {int driver,mode,i; float x0,y0,y1,x1 ...

  5. 计算机图形学画圆和直线代码,计算机图形学作业(中点法画直线和八分画圆法).doc...

    中点法画直线: void MidBresenhamLine(CDC *pDC,int x0,int y0,int x1,int y1,int color){ int dx,dy,d,up,down,x ...

  6. html5画直线,小白学canvas-从0到1,画直线

    canvas意思是"画布",是使用js动态生成的,基于"位图",放大会失真,每次修改,都需要重新绘制. SVG相当于"矢量图",是使用XML ...

  7. 布兰森汉姆画圆matlab,bresenham算法画直线

    实验一名称:基本图形的生成算法 要求:(1)掌握 DDA 生成线段算法 (2)掌握 Bresenham 生成线段算法 (3)掌握生成圆弧算法 1. 代码 (1) Bresenham 画线算法 v 实验 ...

  8. speedoffice(Excel)如何画直线

    有时候我们会遇到要在Excel中画直线,你知道怎么表格中画直线吗?一起来看看吧 打开Excel点击"插入"下方的"形状"字样 在"形状"的下 ...

  9. DDA(数值微分法)绘制直线(C++,VS2019)

    1.DDA(Digital Differential Analyzer)算法 DDA算法是计算机图形学中最简单的绘制直线算法. 已知直线段两个端点P0(x0,y0),P1(x1,y1). 则可求得直线 ...

最新文章

  1. java判断自己活了多少天_用程序计算你活了多少天
  2. linux tomcat7怎么安装,centos7安装Tomcat7,
  3. Java实现在线预览功能
  4. python 实例对象 浅拷贝_Python3 入门教程——浅拷贝深拷贝差别
  5. Github 热榜项目:如何让你的终端酷炫到没朋友
  6. 中国人工智能学会通讯——智能系统测评:挑战和机遇
  7. python的金融计算器_Python计算器
  8. cas单点登录的时序图
  9. 两阶段网络DEA及其计算
  10. C# PDF 静默打印
  11. gitbub.com设置协作者提交代码步骤
  12. 在多个QQ号码间共享自定义表情(转)
  13. stm32f107基本资料
  14. 回归A股成“网红”,中芯国际20年芯片发展史
  15. 这次的室温超导爆炸性发现,会是人类的进步?
  16. HDU 2544 最短路(最短路入门)
  17. 关于C语言网络编程(Linux)的初学习。
  18. 机器人运动控制算法专栏介绍
  19. 每日一题 hiho1318 非法二进制数
  20. 自己使用vue写的一个还觉得不错的登录注册页面

热门文章

  1. 小玩意.包含全国省市区街道邮编的数据库
  2. php多个三元同用,PHP 三元运算很好用也很容易踩雷
  3. 新准则金融资产三分类:AMC、FVOCI和FVTPL
  4. React 路由基础--React路由介绍
  5. Jenkins自动部署测试环境之jar包自动部署
  6. 客厅放一样东西会失去贵人,你一定要知道!
  7. Cocos2d-x制作跳棋结束总结
  8. Linux-无线图标莫名消失的解决方法
  9. Tomcat启动错误PermGen space
  10. 为何要用sys.exit()退出?