取出数组中和为n的组合5的下表

【图文】第5章数组和广义表_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
第5章数组和广义表
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢博客分类:
OpenGL作为一个高性能的图形接口,性能能肯定是放在第一位的了,
现在的移动平台也是OpenGL ES,这对性能的要求就更高了,
今天我们要接触到的这两个东西—顶点数组和显示列表都是用于实现高性能绘图的手段。
下一篇教程我打算去做一个一个3D漫游的例子,会用到今天的技术。
二、顶点数组
在之前的几篇教程中,有时候绘制一个图形需要很多次函数调用才能完成。
首先调用一次glBegin(),然后为每个点调用一次函数,最后还要调用glEnd().中间
如果还要设置颜色或是法线什么的,函数的调用次数还要增加,这给系统带来了很大的
开销,影响了程序的性能。
OpenGL提供了一些顶点数组函数,允许只用少数几个数组指定大量的与顶点相关的数据,
把数据放在顶点数组中可以提高应用程序的性能还可一减少函数调用的次数,从而提高性能。
另外,使用顶点数组还可以避免共享顶点的冗余处理。
使用顶点数组对几何图元进行渲染的3个步骤:
1)激活数组,存储顶点坐标、RGBA颜色等等;
2)装载数组
3)利用数组绘制图形
首先用一个简单的例子来演示一下,用顶点数组绘制带颜色的三角形。
首先在initializeGL()中设置参数:
void NeHeWidget::initializeGL()
// 启用阴影平滑
glShadeModel( GL_SMOOTH );
// 黑色背景
glClearColor( 0.0, 0.0, 0.0, 0.0 );
// 设置深度缓存
glClearDepth( 1.0 );
// 启用深度测试
glEnable( GL_DEPTH_TEST );
// 所作深度测试的类型
glDepthFunc( GL_LEQUAL );
// 告诉系统对透视进行修正
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
glClearColor(0.0, 0.0, 0.0, 0.0);
// 启用顶点数组
glEnableClientState(GL_VERTEX_ARRAY);
// 颜色数组也需要启用
glEnableClientState(GL_COLOR_ARRAY);
// 默认就是此参数,可忽略,为了明确说明特意指定
glShadeModel(GL_SHADE_MODEL);
// 顶点数组数据
static GLfloat fVertices[] = {
-0.5, -0.5,
0.5, -0.5,
// 颜色数组
static GLfloat fColor[] = { 1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0,
// 指定顶点数组数据
glVertexPointer(2, GL_FLOAT, 0, fVertices);
//指定颜色数组
glColorPointer(3, GL_FLOAT, 0, fColor);
接着在paintGL()中绘制图形:
void NeHeWidget::paintGL()
// 清除屏幕和深度缓存
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
//移到屏幕的左半部分,并且将视图推入屏幕背后足够的距离以便我们可以看见全部的场景
glTranslatef(0.0f,0.0f,zoom);
glBegin(GL_TRIANGLES);
glArrayElement(0);
glArrayElement(1);
glArrayElement(2);
可以看到,我们得到的效果和一个个定义顶点,一个个定义颜色是一样的。
下面解释其中的几个函数:
void glEnableClientState(GLenum array)
用于制动需要启用的数组,例子中GL_VERTEX_ARRAY表示顶点数组,GL_COLOR_ARRAY表示颜色数组。开启一种顶点数组都必须调用glEnableClientState来激活.
glDisableClientState(GLenum array)
用于关闭相应的数组。
void glVertexPointer( GLint
size,GLenum
type,GLsizei
stride,const GLvoid *
指定需要访问的空间的坐标数据,作用是把一数组与图形的顶点关联在一起。
glColorPointer意思相类似。
glArrayElement则根据顶点数组来调用相应的函数,每次只调用1个顶点。
如果将两个数组合并在一起,那么坐标和颜色的数据就在一个数组了,现在代码修改如下:
static GLfloat data[]={
-0.5, -0.5,1.0, 0.0, 0.0,
0.5, -0.5, 0.0, 1.0, 0.0,
0.5, 0.0, 0.0, 1.0,
glVertexPointer(2,GL_FLOAT,5*sizeof(GLfloat),&data[0]);
glColorPointer(3,GL_FLOAT,5*sizeof(GLfloat),&data[2]);
这里用到了跨距的概念,第3个参数指定跨距,如颜色,从数组的每组数据的第3个开始取数据,然后跨5个,坐标顶点则从数据每组数据的第1个开始取数据并跨5个.
注意:由于跨距需要计算数据类型,所以数组的数据类型需要相同.
最后得到的效果与之前的一样。
解引用数组
下面要用到的是glDrawElements,学名叫解引用数组,作用类似于循环调用glArrayElement,但需要定义一个索引的数组。有了它,我们只需要一句函数调用就可以把图形绘制出来了,继续修改代码。
只需修改paintGL()中的代码,将glBegin()和glEnd()还有它们之间的代码换成:
//定义索引数组
GLubyte index[]= {0,1,2,3} ;
//解引用数组
glDrawElements(GL_TRIANGLES,3,GL_UNSIGNED_BYTE,index);
接下来,我们来利用解引用数组绘制一个立方体。
//正方体绘制
static GLfloat data[]={
-1.0, -1.0, -1.0 , 0.0, 0.0, 0.0 ,
1.0, -1.0, -1.0 ,0.0, 0.0, 1.0,
1.0, 1.0, -1.0 ,0.0, 1.0, 0.0 ,
-1.0, 1.0,-1.0 ,0.0,1.0, 1.0,
-1.0, -1.0, 1.0 ,1.0, 0.0, 0.0,
1.0, -1.0, 1.0 ,
1.0, 0.0, 1.0,
1.0, 1.0, 1.0 ,1.0,1.0, 0.0,
-1.0, 1.0, 1.0 ,1.0, 1.0, 1.0 ,
//指定顶点数据
glVertexPointer(3,GL_FLOAT,6*sizeof(GLfloat),&data[0]);
//指定颜色数据
glColorPointer(3,GL_FLOAT,6*sizeof(GLfloat),&data[2]);
//指定索引序列
static const GLint face_lists[][4]=
0, 3, 2, 1,
6, 5, 1, 2,
3, 0, 4, 7,
3, 7, 6, 2,
0, 4, 5, 1,
7, 4, 5, 6,
};//注意每个面绘制的顺序,背面采用顺时针方向。
//绘制图形
glDrawElements( GL_QUADS, 24, GL_UNSIGNED_INT, face_lists );
最后结果如下:
我们在定义出数组之后,只用了一条语句便画出了一个立方体,而不是像之前那样定义24次顶点,同时定义24次颜色。
glArrayElement击败了glVertex*,但是glDrawElements又比glArrayElement更高。glDrawElements使用的时候将一连串glArrayElement需要使用的数据放在一个数组中(此例中是byRectIndices),然后通过一个函数调用一次指定。注意啊,glDrawElements自带glBegin及glEnd效果,不再需要它们。(事实上,在OpenGL中命名中带Draw的一般都不需要glBegin和glEnd)程序运行的效果与glVertexArrayWithColor例子运行效果相同。
需要提一下的还有glMultiDrawElements,它是glDrawElements的升级版,一条语句相当于多条glArrayElements,接口有点麻烦,使用方法可以参考文档。
这个有点类似上面说到的跨距的使用了,也是将不同的顶点数组放在同一个数组中,然后用相应的方法把
它解析出来,这里要用到的是glInterleavedArrays,函数将会根据参数,激活各种顶点数组,并存储顶点。
修改代码:
static GLfloat data[]={
-0.5, -0.5,1.0, 0.0, 0.0,
0.5, -0.5, 0.0, 1.0, 0.0,
0.5, 0.0, 0.0, 1.0,
glInterleavedArrays(GL_C3F_V3F,0,data);
glDrawArrays(GL_LINES,0,4);
对应于相应的参数,就可以实现相应的图形,感觉这个比跨距的使用更简单一些,代码也会更加清晰。
OpenGL提供了一系列更加高效的函数以完成对效率要求苛刻的任务,我们将逐一介绍,会发现,使用难度越来越高,适用范围越来越窄,但是函数调用越来越少,功能越来越强大,事实上,函数调用少并不是OpenGL这样设计的唯一理由,越是这样同时处理多个数据的接口,因为一个接口掌握的信息越多,那么也就越能更多的对其进行优化。
三、显示列表
显示列表可以用来存储OpenGL函数,供以后执行。如果需要多次重绘同一个几何图形,或者如果有一些需要多次调用的用于更改状态的函数,把这些函数存储在显示列表中是一个很好的思路。
为了实际操作一下,我们先在我们的项目中添加glut库。
在.pro文件中添加
LIBS += -lglut
简单介绍一下glut库
GLUT(英文全写:OpenGL Utility Toolkit)是一个处理OpenGL程式的工具库,负责处理和底层操作系统的呼叫以及I/O,并包括了以下常见的功能:
定义以及控制视窗
侦测并处理键盘及鼠标的事件
以一个函数呼叫绘制某些常用的立体图形,例如长方体、球、以及犹他茶壶(实心或只有骨架,如glutWireTeapot())
提供了简单选单列的实现。
*注意:在使用glut函数之前一定要对其进行和初始化,在man.cpp的main函数中加入glutInit(&argc, argv);
创建显示列表
  OpenGL提供类似于绘制图元的结构即glBegin()与glEnd()的形式创建显示列表,其相应的函数为:
void glNewList(GLuint list,GLenum mode);
  说明一个显示列表的开始,其后的OpenGL函数存入显示列表中,直至调用结束表的函数(见下面)。参数list是一个正整数,它标志唯一的显示列表。参数mode的可能值有GL_COMPILE和GL_COMPILE_AND_EXECUTE。若要使后面的函数语句只存入而不执行,则用GL_COMPILE;若要使后面的函数语句存入表中且按瞬时方式执行一次,则用GL_COMPILE_AND_EXECUTE。
void glEndList(void);
  标志显示列表的结束。
执行显示列表
在建立显示列表以后就可以调用执行显示列表的函数来执行它,并且允许在程序中多次执行同一显示列表,同时也可以与其它函数的瞬时方式混合使用。显示列表执行的函数形式如下:
void glCallList(GLuint list);
执行显示列表。参数list指定被执行的显示列表。显示列表中的函数语句按它们被存放的顺序依次执行;若list没有定义,则不会产生任何事情。下面举出一个应用显示列表的简单例子:
首先是没有用显示列表的状态:
//绘制100个茶壶
glColor3f( 0.0, 1.0,1.0 );
for(int i=0;i&10;i++)
for(int j=0;j&10;j++)
glTranslatef(j*0.5f,0.0f,0.0f);
glPushMatrix();
glutWireTeapot(0.2);
glPopMatrix();
glTranslatef(0.0f,-0.4f,0.0f);
结果会在屏幕上绘制100个茶壶。
下面用显示列表来实现:
在initializeGL()中添加:
glNewList (teapotList, GL_COMPILE);
glutWireTeapot(0.2);
glEndList ();
创建了一个teapotList的列表,接着我们在循环中替换相应的代码:
for(int i=0;i&10;i++)
for(int j=0;j&10;j++)
glPushMatrix();
glTranslatef(j*0.5f,0.0f,0.0f);
//glutWireTeapot(0.2);
glCallList (teapotList);
glPopMatrix();
glTranslatef(0.0f,-0.4f,0.0f);
实际运行发现渲染的速度会快一点点(感觉是心理作用),可能是小的场景差别不是很大,有兴趣的同学可以测一下fps,结果就会明晰了。
四.参考资料1.
《 》, OpenGL 参考手册2.
《 OpenGL 编程指南》(《 OpenGL Programming Guide 》), Dave Shreiner , Mason Woo , Jackie Neider , Tom Davis 著,徐波译,机械工业出版社3.
《win32 OpenGL编程 》
一个大牛的博客
《OpenGL函数思考 》
里面有很多OpenGL函数的通俗解释
更多详细信息请查看
浏览: 1079100 次
Android自动化测试从入门到精通网盘地址:https:// ...
[size=xx-large][size=xx-small][ ...
同求源码,这几天正想研究一下视频的相关功能mail: 1862 ...
源代码可以发给我一份吗?谢谢!qq邮箱:@ ...
源码能给一份吗,谢谢!mail:
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'第5章 数组和广义表答案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
第5章 数组和广义表答案
&&数据结构
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩19页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢& 排列与组合的综合知识点 & “设数组A:{a1,a2,…,an}与数组...”习题详情
0位同学学习过此题,做题成功率0%
设数组A:{a1,a2,…,an}与数组B:{b1,b2,…,bn},A与B中的元素不完全相同,分别从A、B中的n个元素中任取m(m≤n)个元素作和,各得Cnm个和.若由A得到的Cnm个和与由B得到的Cnm个和恰好完全相同,则称数组A与B是n元中取m的全等和数组,简记为DHnm数组.(1)判断数组A:{5,15,25,45}与B:{0,20,30,40}是否为DH42数组?(2)若数组A:{a1,a2,…,an}与数组B:{b1,b2,…,bn}是DHnm数组(m≤n),求证:数组A与B一定是DHnn数组(3)给定数组A:{a1,a2,a3,a4},其中a1≤a2≤a3≤a4,问是否存在数组B,使得数组A与B为DH42数组?若存在,则求出数组B;若不存在,请说明理由.&
本题难度:一般
题型:解答题&|&来源:2009-上海市黄浦区大同中学高三(下)开学摸底数学试卷(理科)
分析与解答
习题“设数组A:{a1,a2,…,an}与数组B:{b1,b2,…,bn},A与B中的元素不完全相同,分别从A、B中的n个元素中任取m(m≤n)个元素作和,各得Cnm个和.若由A得到的Cnm个和与由B得到的Cnm个和...”的分析与解答如下所示:
(1)A中C42个和为:20,30,40,50,60,70B中C42个和为:20,30,40,50,60,70∴A与B为DH42数组(2)证明:从A中任取m个元素作和共得Cnm个数,再将Cnm个数作和记为S,在Cnm个数中a1、a2、…、an都分别出现了Cn-1m-1次,故S=Cn-1m-1(a1+a2+…an)同样从B中任取m个元素作和共得Cnm个数,这些数的和为S',S'=Cn-1m-1(b1+b2+…bn)显然S=S'∴a1+a2+…an=b1+b2+…bn即A与B为DHnn数组(3)假设存在数组B:{b1,b2,b3,b4}(不妨设b1≤b2≤b3≤b4)与A是DH42数组,则有a1+a2=b1+b2、a1+a3=b1+b3、a2+a4=b2+b4、a3+a4=b3+b4不妨设b1=a1-q则b2=a2+q,b3=a3+q,b4=a4-q从而a2+a3=b1+b4(不能等于b2+b3否则q=0与题意不符)故①a1+a4≠a2+a3,则一定存在唯一数组B:{a1-q,a2+q,a3+q,a4-q}(其中)与A是DH42数组②a1+a4=a2+a3,则不存在数组B与A是DH42数组.
找到答案了,赞一个
如发现试题中存在任何错误,请及时纠错告诉我们,谢谢你的支持!
设数组A:{a1,a2,…,an}与数组B:{b1,b2,…,bn},A与B中的元素不完全相同,分别从A、B中的n个元素中任取m(m≤n)个元素作和,各得Cnm个和.若由A得到的Cnm个和与由B得到的...
错误类型:
习题内容残缺不全
习题有文字标点错误
习题内容结构混乱
习题对应知识点不正确
分析解答残缺不全
分析解答有文字标点错误
分析解答结构混乱
习题类型错误
错误详情:
我的名号(最多30个字):
看完解答,记得给个难度评级哦!
经过分析,习题“设数组A:{a1,a2,…,an}与数组B:{b1,b2,…,bn},A与B中的元素不完全相同,分别从A、B中的n个元素中任取m(m≤n)个元素作和,各得Cnm个和.若由A得到的Cnm个和与由B得到的Cnm个和...”主要考察你对“排列与组合的综合”
等考点的理解。
因为篇幅有限,只列出部分考点,详细请访问。
排列与组合的综合
排列与组合的综合.
与“设数组A:{a1,a2,…,an}与数组B:{b1,b2,…,bn},A与B中的元素不完全相同,分别从A、B中的n个元素中任取m(m≤n)个元素作和,各得Cnm个和.若由A得到的Cnm个和与由B得到的Cnm个和...”相似的题目:
从4名男生、3名女生中各选出2名组成研究性学习小组,并从选出的4人中再选定1人当组长,则不同选法的种数是
若二项式的展开式的第三项是常数项,则=&&&&.
的二项展开式中含的项是&&&&(的系数用数值表示).
“设数组A:{a1,a2,…,an}与数组...”的最新评论
该知识点好题
该知识点易错题
欢迎来到乐乐题库,查看习题“设数组A:{a1,a2,…,an}与数组B:{b1,b2,…,bn},A与B中的元素不完全相同,分别从A、B中的n个元素中任取m(m≤n)个元素作和,各得Cnm个和.若由A得到的Cnm个和与由B得到的Cnm个和恰好完全相同,则称数组A与B是n元中取m的全等和数组,简记为DHnm数组.(1)判断数组A:{5,15,25,45}与B:{0,20,30,40}是否为DH42数组?(2)若数组A:{a1,a2,…,an}与数组B:{b1,b2,…,bn}是DHnm数组(m≤n),求证:数组A与B一定是DHnn数组(3)给定数组A:{a1,a2,a3,a4},其中a1≤a2≤a3≤a4,问是否存在数组B,使得数组A与B为DH42数组?若存在,则求出数组B;若不存在,请说明理由.”的答案、考点梳理,并查找与习题“设数组A:{a1,a2,…,an}与数组B:{b1,b2,…,bn},A与B中的元素不完全相同,分别从A、B中的n个元素中任取m(m≤n)个元素作和,各得Cnm个和.若由A得到的Cnm个和与由B得到的Cnm个和恰好完全相同,则称数组A与B是n元中取m的全等和数组,简记为DHnm数组.(1)判断数组A:{5,15,25,45}与B:{0,20,30,40}是否为DH42数组?(2)若数组A:{a1,a2,…,an}与数组B:{b1,b2,…,bn}是DHnm数组(m≤n),求证:数组A与B一定是DHnn数组(3)给定数组A:{a1,a2,a3,a4},其中a1≤a2≤a3≤a4,问是否存在数组B,使得数组A与B为DH42数组?若存在,则求出数组B;若不存在,请说明理由.”相似的习题。数据结构第五章数组和广义表习题及答案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
数据结构第五章数组和广义表习题及答案
&&第五章数组和广义表习题及答案
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 php 取出数组的一部分 的文章

 

随机推荐