基于OpenGL实现多段Bezier曲线拼接_C 语言

来源:脚本之家  责任编辑:小易  

基于OPENGL的天空云彩显示 方法设计与实现,什么时间要的了。可以的

本文实例为大家分享了OpenGL实现多段Bezier曲线拼接的具体代码,供大家参考,具体内容如下

创建你想要的任意复杂的几何形体

运行程序的交互方式有点类似corelDraw中的自由曲线绘制,或者photoShop中的钢笔自由路径绘制。

2014年4月,跨平台集成开发环境Qt Creator 3.1.0正式发布,实现了对于iOS的完全支持,新增WinRT、Beautifier等插件,废弃了无Python接口的GDB调试支持,集成了基于Clang的C/C++代码模块,并对Android支持

截图:

将BezierCurve封装成了一个类,代码如下:

CS1.6里视频设置里的D3D和OPENGL的区别为:标准不同、硬件需求不同、渲染不同。一、标准不同 1、D3D:是微软为提高3D游戏在Windows中的显示性能而开发的显示程序接口,目前已经升级到12版本,它

#ifndef _BEZIERCURVE_H #define _BEZIERCURVE_H #include "vec3.hpp" #include <vector> #include <iostream> #include <gl/glut.h> using namespace std; //// 3次bezier曲线: 四个控制节点。曲线经过首末两个顶点。 class BezierCurve { public: //cell一共有四个控制顶点 // -cell经过V0和V3顶点, // -cell的始端相切于直线:(V0, V1) 和末端相切于(V2,V3) class BezierCell { public: BezierCell(int i0, int i1, int i2, int i3) { setValue(i0, i1, i2, i3); } void setValue(int i0, int i1, int i2, int i3) { ctrlVertxIndex[0] = i0; ctrlVertxIndex[1] = i1; ctrlVertxIndex[2] = i2; ctrlVertxIndex[3] = i3; } const int operator[](int index) const { if (index > 3 || index < 0) return -1; return ctrlVertxIndex[index]; } int ctrlVertxIndex[4]; }; enum eventType { LButtonDown = 0, MouseMove = 1, LButtonUp = 2 }; enum { Bezier3CtrlPnt = 4 }; BezierCurve() { clear(); } ~BezierCurve(){} void begin() { // 开启求值器 glEnable(GL_MAP1_VERTEX_3); clear(); } void mouseSynchro(eventType type, const Vec3d& v) //响应鼠标motion { ////////////////////////////////////////////////////////////////////////// //LButtonDown: 压入点 if (type == LButtonDown) { if (isFirstRender) //for the first cell { vertexVector.push_back(v); //push V0... vertexVector.push_back(v); //push V1... } else if ( cellRenderState() == cellRenderImple::Push ) //for any cell { vertexVector.push_back(v); //push V2... vertexVector.push_back(v); //push V3... cellRenderState.setChange(); //set the flag to change V3 cellNum++; //increase the cell counter } } ////////////////////////////////////////////////////////////////////////// //MouseMove: 动态更新相应的顶点数据 else if (type == MouseMove) { if (isFirstRender) //for the first cell { vertexVector.back() = v; //change the V1 immediately } else if ( cellRenderState() == cellRenderImple::Change )//for any cell { int vecSize = vertexVector.size(); vertexVector[vecSize-2] = v; //change the V2 immediately } } ////////////////////////////////////////////////////////////////////////// //LButtonUp: 为拼接做准备 else if (type == LButtonUp) { if (isFirstRender) { //只有第一个BezierCell可以编辑bezierCell的起始段:(V0,V1) isFirstRender = false; } else if ( cellRenderState() == cellRenderImple::Change) { //if finish the current cell's render //利用v1和中点v0计算出v2:(v1 + v2) / 2 = v0 //next cell begin: push the next cell's V1... int vecSize = vertexVector.size(); Vec3d v0 = vertexVector[vecSize-1]; Vec3d v1 = vertexVector[vecSize-2]; Vec3d v2 = 2 * v0 - v1; vertexVector.push_back(v2); //重置cellRenderFlag cellRenderState.setPush(); } } ////////////////////////////////////////////////////////////////////////// //更新数组的长度 _updateVertexNum(); } void end() { glDisable(GL_MAP1_VERTEX_3); } void renderCurve() { ////////////////////////////////////////////////////////////////////////// //rendering vertex... for (int i=0; i<vertexVector.size(); i++) { Vec3d v = vertexVector[i]; glBegin(GL_POINTS); glVertex3dv(v.getValue()); glEnd(); } ////////////////////////////////////////////////////////////////////////// //rendering moving tangent(切线) //(vertexNum-1, vertexNum-2) if ( vertexNum>=2 ) { glEnable(GL_LINE_STIPPLE); { glLineStipple(1, 0x0101); glBegin(GL_LINES); { Vec3d v1 = vertexVector[vertexNum-1]; Vec3d v2 = vertexVector[vertexNum-2]; glVertex3dv(v1.getValue()); glVertex3dv(v2.getValue()); } glEnd(); }glDisable(GL_LINE_STIPPLE); } ////////////////////////////////////////////////////////////////////////// //if ( !_check() ) // return; //rendering bezier cells... system("CLS"); for (int i=0; i<cellNum; i++) { int pos = i * 3; if ( (pos+3) < vertexNum ) renderBezierCell( BezierCell(pos, pos+1, pos+2, pos+3) ); } ////////////////////////////////////////////////////////////////////////// } // 3次bezier曲线经过vetex0和vextex3 void renderBezierCell(const BezierCell& cell) { double *pBuffer = new double[Bezier3CtrlPnt * 3]; cout << "----------------------------------------------------" << endl; cout << "Vertex number : " << vertexNum << endl; cout << "Cell number : " << cellNum << endl; cout << "The render cell: " << cell[0] << " " << cell[1] << " " << cell[2] << " " << cell[3] << endl; for (int i = 0, bg = 0; i<4; i++) { Vec3d v = vertexVector[ cell[i] ]; pBuffer[bg++] = v.x(); pBuffer[bg++] = v.y(); pBuffer[bg++] = v.z(); cout << v.x() << " " << v.y() << " " << v.z() << endl; }cout << "----------------------------------------------------" << endl; glMap1d(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, Bezier3CtrlPnt, pBuffer); glBegin(GL_LINE_STRIP); { for (int i = 0; i <= 30; i++) glEvalCoord1f((GLfloat) i/30.0f); } glEnd(); delete pBuffer; pBuffer = 0; } void clear() { cellNum = 0; vertexNum = 0; isFirstRender = true; vertexVector.clear(); } protected: bool _check() { vertexNum =vertexVector.size(); return vertexNum == (cellNum - 1) * 3 + 4; } void _updateVertexNum() { vertexNum=vertexVector.size();} int cellNum; //单元个数 int vertexNum; //顶点个数 bool isFirstRender; //首次标志 std::vector<Vec3d> vertexVector; //顶点数组 class cellRenderImple { public: enum RenderStep { Push = 0, Change = 1 }; cellRenderImple(){ setPush(); } bool operator()(void) { return flag; } void setPush() { flag = Push; } void setChange() { flag = Change; } RenderStep flag; //cell的渲染状态 } cellRenderState; };

一般gl开发用c和c++比较,java我没有做过,就说说vc下的gl开发。gl有gl、glu、glut等库,gl是基本库,glu是工具库,glut是windows下的辅助库。学习gl,有红宝书和蓝宝书,红宝书就是指《opengl开发指南》

测试程序如下:

对于莲花菩提的欣赏与把玩,建议大家讲究一个适度,不需要片面刻意地去追求多好多好的品相、或是多贵的价格,重点还是在于大家能够用一个欣赏、喜爱的态度去对待它,而且大家都知道,菩提的重点在于“盘玩”,再好的莲花菩提,如果你不会盘,玩坏了那也是浪费,而品相稍差的莲花菩提,如果好好用心把玩的话,包浆包得好,自然就能够让它提升一个品质了。那么莲花菩提子怎么盘呢?今天就来和大家分享一些慕容阁里面有关于莲花菩提的日常盘玩的方法与技巧,首先要说的就是把玩的一个细节全面性,一般来说大家手中的莲花菩提都是做成手串的,这就使得不少人在把玩的时候往往忽略了侧面,其实在把玩莲花菩提时,应该注意把侧面也盘进去,比如说使用有

#include <iostream> #include <vector> #include <GL/glut.h> #include "BezierCurve.h" using namespace std; enum WindowSize{ WinWidth = 1024, WinHeight = 768 }; int g_Viewport[4]; double g_ModelMatrix[16]; double g_ProjMatrix[16]; BezierCurve myBezier; ////////////////////////////////////////////////////////////////////////// void init(); void display(); void reshape(int w, int h); void keyboard(unsigned char key, int x, int y); void mouse(int button, int state, int x, int y); void motion(int x, int y); int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (WinWidth, WinHeight); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]);

狗狗有尖利的牙齿却不愿意伤害我们。可狗狗有时候不经意的一些行为,你就打骂它。你可知道,狗狗是你生活的一小部分,而你是狗狗生活的全部。我们不该打骂,而是用狗狗期待的玩耍或奖励来引导狗狗告诉它这些行为是错误的。来,我们来共同探讨下,你是不是也做过一些令自家狗狗很伤心的事情。1、避免与其他狗狗接触有些主人很介意自家的狗狗与他人的狗狗玩耍,觉的别人家的狗狗不如自家的。但是你知道吗?狗狗也是有社交需求的,在安全的情况下,让它多和其他狗狗玩耍,有助于曾强它的社交能力。2、洗澡频繁事实上,大部分的狗狗都是不爱洗澡。它们可能觉得自己很干净,不用洗。可你却硬逼着去洗澡。这样会增强狗狗讨厌洗澡的心。建议主人找专业

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

基于OpenGL ES的压缩纹理有常见的如下几种实现:

2.PVRTC(PowerVR texture compression)
3.ATITC(ATI texture compression)
对于使用NVIDIA Tegra2芯片的手机如Motorola XOOM,ATRIX和DRIOID BIONIC则支持如下的纹理压缩
4.S3TC(S3 texture compression)ETC1:ETC1格式是OpenGL ES图形标准的一部分,并且被所有的Android设备所支持。扩展名为:GL_OES_compressed_ETC1_RGB8_texture,不自持透明通道,所以仅能用于不透明纹理。PVRTC:被用在Motorola的一些机器上,比如DROID系列。GPU为Imagination Technologies的PowerVR SGX 530。OpenGL ES的扩展名为:GL_IMG_texture_compression_pvrtc,支持预处理压缩。当加载压缩纹理时,参数支持如下几种格式:
COMPRESSED_RGB_PVRTC_4BPPV1_IMG(RGB 4 bit per pixel)
COMPRESSED_RGB_PVRTC_2BPPV1_IMG(RGB 2 bit per pixel)
COMPRESSED_RGBA_PVRTC_4BPPV1_IMG(RGB 4 bit per pixel with alpha channel)
COMPRESSED_RGBA_PVRTC_2BPPV1_IMG(RGB 2 bit per pixel with alpha channel)ATITC:当前使用该种纹理压缩的机器有Nexus One。支持的OpenGL ES扩展名为:GL_ATI_texture_compression_atitc。当加载压缩纹理时,参数支持如下类型的纹理:
ATC_RGB_AMD(RGB textures)
ATC_RGBA_EXPLICIT_ALPHA_AMD(RGB textures using explicit alpha encoding)
ATC_RGBA_INTERPOLATED_ALPHA_AMD(RGBA textures using interpolated alpha encoding)S3TC也被称为DXTC,在PC上广泛被使用,但是在移动设备上还是属于新鲜事物。在使用NVIDA芯片的手机上被使用。OpenGL ES扩展名为:GL_EXT_texture_compression_dxt1和GL_EXT_texture_compression_s3tc。当加载压缩纹理时,的参数有如下几种格式:
GL_COMPRESSED_RGB_S3TC_DXT1(RGB data is compressed,alpha is always 1.0)
GL_COMPRESSED_RGBA_S3TC_DXT1(RGB data is compressed,alpha is either 1.0 or 0.0)
GL_COMPRESSED_RGBA_S3TC_DXT3(RGB data is compressed,alpha is stored as 4 bits)
在程序在开始检测这些可用的扩展很重要。对于ETC1压缩来说,使用ETC1Util.isETC1Supported()即可。

photoshop的发展史是怎么样的呢?

Photoshop是迄今为止世界上最畅销的图象编辑软件。它已成为许多涉及图像处理的行业的标准。并且是Adobe公司最大的经济收入来源。然而Photoshop的开始却是名不经传,如果不是Michigan大学一位研究生学生延迟毕业答辨,Photoshop或许根本就不可能被开发出来。1987年秋,Thomes Knoll,一名美国密歇根大学正在攻读博士学位的研究生,他一直在努力尝试编写一个程序,使得在黑白位图监视器上能够显示灰阶图像。他把该程序命名为Display。但是Knoll在家里用他的Mac Plus计算机编写这个编码纯粹是为了娱乐,与他的论题并没有直接的关系。他认为它并没有很大的价值,更没想过这个编码会是伟大而神奇的Photoshop的开端,自己的姓名也将永远载入史册。他的这个简单的娱乐性编程,却引起了他哥哥John的注意。当时John正效劳于Iindustrial Light Magic(ILM)公司—美国一家影视特效制作公司。随着《星球大战》的诞生,Lucas想向世人证明,真正的计算机软件酷效,配以传奇色彩的英雄人物,将创造出传统手法所不能达到的惊世巨片!当时John正在实验利用计算机创造特效,他让Thomas帮他编写一个程序处理数字图像,这正是Display的一个极佳起点,他们的合作也从此开始,历史已经证明,这是一个伟大的创想,今天,Photoshop已经改变了出版软件的历史,现在它在出版印刷和Web设计两方面占据了领导地位,成为了全球设计软件舞台上的主角之一,其老大地位不可动憾。诺尔两兄弟在此后的一年多的时间里,把Display不断修改为功能更为强大的图像编辑程序,其中进行过多次改名,在一个展会上,他们接受一个参展观众建议,把这个程序改名为Photoshop(中文意:图片处理)。这是一个历史性的更名,此后Photoshop成为全世界都家喻户晓的设计软件。早前年诺尔两兄弟一直着手开发Photoshop的版本,直到4.0版本之后,Adobe公司才出面收购Photoshop。在诺尔兄弟开发Photoshop到转手卖给Adobe公司,其中还是经历很多的很多的磨难。最初,他们俩兄弟是把Photoshop交给一个扫描仪公司搭配卖,名字叫做Barneyscan XP,版本是0.87。然而两兄弟继续为Photoshop找寻买家,在这个过程中,不少知名的大公司都瞧不起这个软件而拒绝了Photoshop。直到他们找到了Adobe的艺术总监,同时他们还碰上了另一款优秀的设计软件(ColorStudio)的竞争,最后是Photoshop打败对方,其实更是Adobe公司慧眼识真玉,才使得Photoshop才正式成为Adobe家族的重要一员,从此以后,Adobe公司集中了众多最优秀的图像设计及软件编程专家和工程师,这以后Photoshop开始进入一个快速成长、不断发展的新阶段,终于成为统治全球图像处理的权威老大,当年那些拒绝购买Photoshop的知名大公司,看着Adobe公司大把大把的经济收入,终于尝到了什么叫做后悔莫及的滋味。1987年,Knoll兄弟编写了一个灰阶图像显示程序,即Photoshop.87,又叫Barneyscan XP
1988年,Adobe公司买下了Photoshop的发行权
1990年,Photoshop 1.0发布,那个时候只有100K大小,从功能上来说仅是有了“工具面板”和少量的滤镜。1991年,Photoshop 2.0发布,Adobe成为行业标准,增加了“路径”功能,以及内存分配从以前的2MB扩展到了4MB,同时支持Illustrator文件格式。1992年,Photoshop 2.5发布,第一个MS Windows版本,Photoshop 2.5.1发布,Photoshop才可以在Windows系统上运行,以此Photoshop不再是为专业的平面设计师所专用,而是面向大众普通用户。在此,2.5版本增加了“Dodge”和“Burn”工具,以及“蒙版”概念。1994年,Photoshop 3.0发布,代号Tiger Mountain,在功能上增加了“图层”,这是一个极其重要的发展标志。1995年末,由于技术问题Photoshop 3.0终止运行,
1996年末,Photoshop 4.0发布,代号Big Electric Cat,Adobe买断了Photoshop的所有权。4.0版本增加了动作功能,调整层,标明版权的水印图像。1998年,Photoshop 5.0发布,增加了历史面板、图层样式、撤消功能、垂直书写文字、魔术套索工具,其中最具创造性的新增了历史动作功能;Adobe公司终于认识到了中国市场的存在,也就是从5.0.2版本开始,Photoshop首次向中国用户设计了中文版,对于我们中国用户来说,真正开始体验到Photoshop强大的图形处理功能应该是从5.02版本开始。1999年,Photoshop 5.5发布,Image Ready 2.0*发布,我们现在所使用的Photoshop*ImageReady套装软件,是从1998年发布的5.5版本开始的,
2000年,Photoshop 6.0发布。以后所有的Photoshop软件都将自动安装ImageReady。由于全球信息化的迅猛发展,网络时代也终于到来,也由于数码相机的迅猛发展,真正意义上数字暗房是从6.0开始,其显著标志就是在6.0版本的功能上,增加了强大的Web功能,包括众多的Web工具,包括Web-safe色彩面板,现在我们常用的“形状”工具是在2000年9月推出的Photoshop6.0版本中增加的新功能,还增加了矢量绘图工具,新的工具栏,扩展的Web工具包,增强的层管理功能。2002年3月Photoshop7.0版本发布,在功能上增加了“Healing Brush”笔刷,以及迎合数码时代的到来,Photoshop具有了强大的数码图像编辑功能,奠定了现在的数字照片处理首选软件老大的地位。2003年,Photoshop CS(8.0)发布。它集成了Adobe的其它软件形成Photoshop Creative Suit
2005年4月Adobe Photoshop CS2发布,开发代号Space Monkey。2006年,Adobe发布了一个开放的Beta版Photoshop Lightroom。2007年4月,发行Adobe Photoshop CS3。2007年,Photoshop Lightroom 1.0正式发布。2008年9月,发行Adobe Photoshop CS4,套装拥有一百多项创新。2008年,Adobe发布了基于闪存的Photoshop应用,提供有限的图像编辑和在线存储功能。2009年,Adobe为Photoshop发布了iPhone(手机上网)版,从此PS登陆了手机平台。2020-05-30,发行Photoshop Express版本。2020-05-30,Adobe Photoshop CS5。2020-05-30发行Adobe Photoshop CS6Beta公开测试版。2020-05-30,发布Adobe Photoshop v1.0.1版源代码。2020-05-30,Adobe在MAX大会上推出了最新版本的Photoshop CC(CreativeCloud。目前photoshop最新版是photoshop cc
更详细的可以在百度百科里面查到更多更详细的资料的。参考资料:http://baike.baidu.com.alimamy.com.szxinji.com/view/2929.htm?fr=aladdin

opengl和opencv的区别

OpenCV是 Open Source Computer Vision Library
OpenGL是 Open Graphics Library
OpenCV主要是提供图像处理和视频处理的基础算法库,还涉及一些机器学习的算法。比如你想实现视频的降噪、运动物体的跟踪、目标(比如人脸)的识别这些都是CV的领域
OpenGL则专注在Graphics,3D绘图。其实两者的区别就是Computer Vision和Computer Graphics这两个学科之间的区别,前者专注于从采集到的视觉图像中获取信息,是用机器来理解图像;后者是用机器绘制合适的视觉图像给人看。

游戏里的D3D模式和OPENGL模式各是什么意思?工作原理有什么不同?

D3D,全称为Direct3D,是微软为提高3D游戏在Windows中的e799bee5baa6e79fa5e98193e58685e5aeb931333431373235显示性能而开发的显示程序接口,目前已经升级到12版本,它提供了丰富的3D功能库,是游戏广泛采用的标准。OpenGL是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。两者工作原理上的不同:
1、D3D的原理在于只需要调用D3D提供的接口函数和功能就能实现显示功能,通过分工合作,极大的降低了软件开发周期和成本。2、OpenGL的高效实现是利用了图形加速硬件,存在于Windows,部分UNIX平台和Mac OS。这些实现一般由显示设备厂商提供,而且非常依赖于该厂商提供的硬件。扩展资料:
OpenGL规范由1992年成立的OpenGL架构评审委员会(ARB)维护。ARB由一些对创建一个统一的、普遍可用的API特别感兴趣的公司组成。据OpenGL官方网站,2002年6月的ARB投票成员包括3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans&Sutherland;Hewlett-Packard、IBM、Intel、Matrox、NVIDIA、SGI和Sun Microsystems,Microsoft曾是创立成员之一,但已于2003年3月退出。参考资料来源:百度百科—OpenGL
参考资料来源:百度百科—d3d

  • 本文相关:
  • opengl绘制三次bezier曲线
  • 使用opengl绘制bezier曲线
  • opengl画bezier曲线
  • opengl绘制bezier曲线的方法
  • opengl实现bezier曲线的方法示例
  • c++日志记录类实例解析
  • c++设计模式之适配器模式(adapter)
  • c++模板之特化与偏特化详解
  • c语言数据结构之二叉树的非递归后序遍历算法
  • 关于c语言指针的两处小tip分享
  • c++多态的实现及原理详细解析
  • objective-c限制函数调用的频率详解
  • vc中实现gb2312、big5、unicode编码转换的方法
  • c语言中二维数组作为函数参数来传递的三种方法
  • c语言实现单词小帮手
  • 基于OpenGL ES的压缩纹理有常见的如下几种实现:
  • photoshop的发展史是怎么样的呢?
  • opengl和opencv的区别
  • 游戏里的D3D模式和OPENGL模式各是什么意思?工作原理有什么不同?
  • 基于OPENGL的VC++简单示例
  • 基于OPENGL的天空云彩显示方法设计与实现
  • 您好 我现在在做基于opengl的三维交互场景建模,但现在只能实现简单的实体,如何实现复杂实体呢
  • 什么是QT软件?
  • CS1.6里视频设置里的D3D和OPENGL的区别
  • 基于JAVA的openGL
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全c#教程vbvb.netc 语言java编程delphijavaandroidiosswiftscala易语言汇编语言其它相关首页c 语言opengl绘制三次bezier曲线使用opengl绘制bezier曲线opengl画bezier曲线opengl绘制bezier曲线的方法opengl实现bezier曲线的方法示例c++日志记录类实例解析c++设计模式之适配器模式(adapter)c++模板之特化与偏特化详解c语言数据结构之二叉树的非递归后序遍历算法关于c语言指针的两处小tip分享c++多态的实现及原理详细解析objective-c限制函数调用的频率详解vc中实现gb2312、big5、unicode编码转换的方法c语言中二维数组作为函数参数来传递的三种方法c语言实现单词小帮手c语言程序设计50例(经典收藏)c语言10个经典小程序c语言字符串操作总结大全(超详细c语言文件操作函数大全(超详细)c语言字符数组与字符串的使用详解c语言运算符优先级列表(超详细)c语言/c++中如何产生随机数c++中的string常用函数用法总结深入理解c++中public、protectedc++常用字符串分割方法实例汇总减小vc6编译生成的exe文件的大小的方法c++软件添加dump调试打印日志(推荐)c++中静态初始化数组与动态初始化数组详解mfc实现在文件尾追加数据的方法vc实现动态菜单的创建方法c语言指针之二级指针示例基于c语言航班信息查询与检索详细分析android中实现zygote的源码探讨:c++中函数返回引用的注意事项visual studio code安装和配置的教程
    频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved
    百度

    九色优选 | 跳跳猪 | 聚聚玩 | 有赚网 | 聚享游 | 快乐赚