基于OpenGL的随机图动画演示框架与代码

基于Opengl的实时动画,为可视化科学计算过程提供了有利的工具。

然而,对于初学者来说,相关知识的学习仍需经历一个过程。

将Opengl的初始化等进行适当封装,建立了Opengl的动画框架,用户可以直接应用C语言的知识或Matlab知识,定义框架中相应的函数,即可实现实时动画程序开发,为科学计算和可视化计算提供了便利。

下面给出了Ubuntu14.04下,基于OpenGL的点线随机图动画框架。

通过分析该程序,用户可以方便地定制程序,以达到用户算法的期望。

代码如下:

//第三方库: sudo apt-get install freeglut3-dev
//		   其中,用到了glut.h文件
//编译命令:g++ test.cpp -lglut -lGL -lGLU
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <math.h>
#include <GL/glut.h>

using namespace std;

#define Width 600
#define Height 600

typedef struct Point {
	GLfloat x, y;
	Point() : x(0), y(0) {};
	Point(GLfloat x, GLfloat y) : x(x), y(y) {
	}
} Point;

typedef struct Line {
	Point lbegin, lend;
	Line(Point& pa, Point& pb) {
		lbegin.x = pa.x;
		lbegin.y = pa.y;
		lend.x = pb.x;
		lend.y = pb.y;
	}
} Line;

typedef vector<Point> Points;
typedef vector<Line> Lines;

Points points;
//Lines lines;

//用户自定义初始化函数---用于初始化点的坐标
void myinit() {
	srand(time(NULL));
	//随机产生50个点的坐标
	points.resize(50);
	for(int i = 1; i < 50; i++) {
		points[i].x = (rand() * 1.0 / RAND_MAX) * Width - Width / 2;
		points[i].y = (rand() * 1.0 / RAND_MAX) * Height - Height/2;
	}
}

//用户自定义屏幕绘制和计算函数
void myDraw() {
	GLfloat x = rand() * 1.0 / RAND_MAX * 30, y = rand() * 1.0 / RAND_MAX * 30;
	//绘制点的集合
	glColor3f(0.0, 1.0, 0);
	glPointSize(5.0);
	glBegin(GL_POINTS);
	for(int i = 0; i < points.size(); i++)
		glVertex3f(points[i].x, points[i].y, 0);
	glEnd();

	//绘制随机线---模拟可能的计算过程
	glColor3f(0.0, 0.0, 1.0);
	glBegin(GL_LINES);
	for(int i = 0; i < points.size(); i++)
	{
		int id1 = (rand() % 1024) / 1024.0 * points.size();
		int id2 = (rand() % 1024) / 1024.0 * points.size();
		glVertex3f(points[id1].x, points[id1].y, 0);
		glVertex3f(points[id2].x, points[id2].y, 0);
	}
	glEnd();
}

//==========以下代码无需变动======================
void display(void)
{
	//清除屏幕内容
	glClear(GL_COLOR_BUFFER_BIT);
	myDraw();
	//刷新结果
	glFlush() ;
	glutSwapBuffers();
}

void idleDisplay(void)
{
	glutPostRedisplay();
}

void initOpenGL(void)
{
	glClearColor (0.0, 0.0, 0.0, 0.0);
	glShadeModel (GL_FLAT);
}

void reshapeWindow(int w, int h)
{
	glViewport (0, 0, (GLsizei) w, (GLsizei) h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	//设置xmin-xmax, ymin-ymax, zmin-zmax
	glOrtho(-w/2, w/2, -h/2, h/2, -1.0, 1.0); //-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

int main(int argc, char** argv)
{
	myinit();	//调用用户初始化数据函数
	glutInit(&argc, argv);
	glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
	glutInitWindowSize (Width, Height);
	glutInitWindowPosition (0, 0);
	glutCreateWindow (argv[0]);
	initOpenGL();
	//设置显示函数
	glutDisplayFunc(display);
	//设置窗口大小调整时的函数
	glutReshapeFunc(reshapeWindow);
	//闲暇时的后台处理程序---可用于修改数据
	glutIdleFunc(idleDisplay);

	//主循环
	glutMainLoop();
	return 0;
}

效果图如下:

时间: 2024-10-11 09:45:26

基于OpenGL的随机图动画演示框架与代码的相关文章

基于OpenGl的场景图理解

本文的场景图是狭义的,主要局限于变换.本文是对 University Sheffield Dr Steve Maddock的翻译. 1 基本定义 场景图是对push...pop层次的一种可视化描述. 2 建立场景: (1) 场景是由一些独立物体组成的. (2) 每个独立物体有自己的坐标系 eg. 一个正方体可以把其中心放在原点 (3)在物体自己的坐标系里改变物体.eg. 变大缩小,旋转等 (4)通过移动来放置物体到世界坐标系中 (5)基于上图的场景图 相应的代码: 细化drawcubes (6)

【转载】Visaul Studio 常用快捷键的动画演示

[转载]Visaul Studio 常用快捷键的动画演示 在进行代码开发的时候,我们往往会频繁的使用键盘.鼠标进行协作,但是切换使用两种工具会影响到我们的开发速度,如果所有的操作都可以只用键盘来完成,那开发效率将得到大幅度的提升.因此,灵活地应用 Visual Studio 的键盘快捷键,就可以起到事半功倍的地步. 为了便于日后查看,我根据使用的效果分成这么几块:代码编辑.查找与替换.代码美化.代码导航.Visual Studio 窗口和调试,并在最后提供修改默认快捷键的方法.同时,在参考了资源

基于OpenGL ES 的深度学习框架编写

基于OpenGL ES的深度学习框架编写 背景与工程定位 背景 项目组基于深度学习实现了视频风格化和人像抠图的功能,但这是在PC/服务端上跑的,现在需要移植到移动端,因此需要一个移动端的深度学习的计算框架. 同类型的库 caffe-android-lib 目前应该是最便于集成使用的深度学习框架库. tensorflow和mxnet据说也有对应的android库,因时间原因暂未测试. CNNdroid,网址https://zhuanlan.zhihu.com/p/25259452,这个是用 ren

【原创】NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示

申明:本文由作者基于日常实践整理,希望对初次接触MINA.Netty的人有所启发.如需与作者交流,见文签名,互相学习. 学习交流 更多学习资料:点此进入 推荐 移动端即时通讯交流: 215891622 推荐 前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty4(Netty5已经被取消开发了:详见此文). 本文将演示的是一个基于Netty4的UDP服

基于OpenGL编写一个简易的2D渲染框架-05 渲染文本

阅读文章前需要了解的知识:文本渲染 https://learnopengl-cn.github.io/06%20In%20Practice/02%20Text%20Rendering/ 简要步骤: 获取要绘制的字符的 Unicode 码,使用 FreeType 库获取对应的位图数据,添加到字符表中(后面同样的字符可以再表中直接索引),将字符表上的字符填充到一张纹理上.计算每个字符的纹理坐标,使用渲染器绘制 注意的问题: 对于中英文混合的字符串,使用 char 存储时,英文字符占 1 个字节,而中

8款超绚丽的jQuery焦点图动画

随着前端技术和浏览器技术的不断发展,人们开始对网页视觉效果的要求越来越高.我们经常会在页面中看到很多炫酷的图片焦点图播放控件,有些甚至是大屏的焦点图占用大片的页面空间,从而吸引用户的眼球.本文要分享的就是一些超绚丽的jQuery焦点图动画插件,有些不仅基于jQuery,还带有CSS3的动画特效,因此显得更加炫酷. 1.jQuery实用图片滑块焦点图 支持移动端滑动 今天我们要再来介绍一款jQuery实用图片滑块焦点图,它也支持移动端的触屏滑动,这款插件并没有特别的动画效果,但方便实用. 在线演示

jQuery/HTML5响应式焦点图动画应用

详细内容请点击 之前我们分享过不少基于jQuery和HTML5的焦点图动画了,比如这里10款精美实用的jQuery焦点图动画推荐就有不少收集的jQuery焦点图插件,效果非常棒.今天要继续为大家介绍一款jQuery/HTML5响应式焦点图动画插件,它的响应式特性可以让焦点图在移动设备上也有不错的效果.  在线演示源码下载 学习来源:http://www.html5tricks.com/jquery-html5-responsive-slider.html 更多html5内容请点击

基于OpenGL的三维曲面动态显示实现

在使用Visual C++的MFC AppWizard建立应用程序框架后,生成了多个类,与OpenGL编程相关的类是视图类,主要的显示任务都在其中完成. 1.基于OpenGL绘图的基本设置 1.1 设置必要的编译链接环境 OpenGL的图形编程接口包括的主要函数和库函数被封装在动态链接库中,因此在项目中要添加 OpenGL32.dll.glu32.dll和glaux.dll三个库.同时在应用程序的视类头文件中加入OpenGL头文件说明: #include"gl\gl.h" #inclu

基于OpenGL三维软件开发

实验原理: OpenGL在MFC下编程原理---- Windows操作系统对OpenGL的支持 在Windows下用GDI作图必须通过设备上下文(DeviceContext简写DC)调用相应的函数:用OpenGL作图也是类似,OpenGL函数是通过"渲染上下文"(RenderingContext简写RC)完成三维图形的绘制.Windows下的窗口和设备上下文支持"位图格式"(PIXELFORMAT)属性, 和RC有着位图结构上的一致.只要在创建RC时与一个DC建立联