数值微分法绘制直线c语言,OpenGL数值微分法(DDA)画直线
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)画直线相关推荐
- 图形学画直线c语言,计算机图形学:3种画直线算法(转)
//--------------------------------------------------------------------- //绘制直线的DDA算法基本函数 //--------- ...
- 计算机直线的绘制实验报告,dda画直线实验报告
dda画直线实验报告 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 本科实验报告实验名称: DDA直线画法 课程名称: 计算机图形学 ...
- 计算机图形学画直线程序豆丁网,计算机图形学DDA生成直线画法程序.doc
计算机图形学DDA生成直线画法程序 实验一.直线的生成 一.实验目的 掌握DDA直线画法.中点画线法和Bresenham画线法 掌握VC++简单程序设计方法 二.实验内容 根据提供的程序框架,修改部分 ...
- C语言编程之用line画直线
问题描述:学习使用line画直线. 程序源码: #include<graphics.h> void main() {int driver,mode,i; float x0,y0,y1,x1 ...
- 计算机图形学画圆和直线代码,计算机图形学作业(中点法画直线和八分画圆法).doc...
中点法画直线: void MidBresenhamLine(CDC *pDC,int x0,int y0,int x1,int y1,int color){ int dx,dy,d,up,down,x ...
- html5画直线,小白学canvas-从0到1,画直线
canvas意思是"画布",是使用js动态生成的,基于"位图",放大会失真,每次修改,都需要重新绘制. SVG相当于"矢量图",是使用XML ...
- 布兰森汉姆画圆matlab,bresenham算法画直线
实验一名称:基本图形的生成算法 要求:(1)掌握 DDA 生成线段算法 (2)掌握 Bresenham 生成线段算法 (3)掌握生成圆弧算法 1. 代码 (1) Bresenham 画线算法 v 实验 ...
- speedoffice(Excel)如何画直线
有时候我们会遇到要在Excel中画直线,你知道怎么表格中画直线吗?一起来看看吧 打开Excel点击"插入"下方的"形状"字样 在"形状"的下 ...
- DDA(数值微分法)绘制直线(C++,VS2019)
1.DDA(Digital Differential Analyzer)算法 DDA算法是计算机图形学中最简单的绘制直线算法. 已知直线段两个端点P0(x0,y0),P1(x1,y1). 则可求得直线 ...
最新文章
- java判断自己活了多少天_用程序计算你活了多少天
- linux tomcat7怎么安装,centos7安装Tomcat7,
- Java实现在线预览功能
- python 实例对象 浅拷贝_Python3 入门教程——浅拷贝深拷贝差别
- Github 热榜项目:如何让你的终端酷炫到没朋友
- 中国人工智能学会通讯——智能系统测评:挑战和机遇
- python的金融计算器_Python计算器
- cas单点登录的时序图
- 两阶段网络DEA及其计算
- C# PDF 静默打印
- gitbub.com设置协作者提交代码步骤
- 在多个QQ号码间共享自定义表情(转)
- stm32f107基本资料
- 回归A股成“网红”,中芯国际20年芯片发展史
- 这次的室温超导爆炸性发现,会是人类的进步?
- HDU 2544 最短路(最短路入门)
- 关于C语言网络编程(Linux)的初学习。
- 机器人运动控制算法专栏介绍
- 每日一题 hiho1318 非法二进制数
- 自己使用vue写的一个还觉得不错的登录注册页面