ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:139.58KB ,
资源ID:5901686      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5901686.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言OpenGL及大数阶乘.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C语言OpenGL及大数阶乘.docx

1、C语言OpenGL及大数阶乘学 院电子信息学院班 级学 号 姓 名摘要:利用openGL 绘制旋转图形,通过改变数据,改变图形颜色,形成不同光影效果,利用不同函数绘制大小,形状不同的实心或线框图形.目录1 摘要 31.1 设计题目 31.2 设计内容 31.3 开发工具 31.4 应用平台 32 详细设计 32.1 程序结构 32.2 主要功能 32.3 函数实现 42.4 开发日志 43 程序调试及运行 43.1 程序运行结果 43.2 程序使用说明 43.3 程序开发总结 54 附件(源程序) 5/*在后面的文档编写中,请你不要修改各个标题的内容,从而确保报告内容和风格一致。完成全部内容后

2、,你只需要在上面的目录上右键“更新域”,选择“只更新页码”就可以更新正确的目录页码。注意:目录的左边距为6.5厘米。*/1 摘要1.1 设计题目OpenGL 图形编程1.2 设计内容做出九个旋转图形,利用光影效果制作不同旋转。1.3 开发工具Code blocks1.4 应用平台Windows 2000/XP 32位2 详细设计2.1 程序结构头文件,静态变量,函数定义,函数调用,主函数。循环型数据结构。2.2 主要功能绘出圆环,茶壶,球,正八面体,线框和实体,还有线框立方体以及自动旋转. 改变各函数的不同数据,可以改变图形形状,图形颜色,图形旋转等功能。原理:glTranslated函数确定

3、每个图形位置;glColor3d(0.6,0.3,0.7);/设置绘图颜色图函数,绘图函数:glPushMatrix();/将当前矩阵压入堆栈 glTranslated(-2.4,3.6,-6);/坐标位置 glRotated(0,1,0,0);/旋转矩阵 glRotated(a,1,0,1); glutWireTorus(0.2,0.8,slices,stacks);/线框圆环体 glPopMatrix();/将当前矩阵弹出堆栈光影响效果函数:const GLfloat light_ambient = 0.0f, 0.0f, 0.0f, 1.0f ;/环境光源const GLfloat li

4、ght_diffuse ;/漫发射光const GLfloat light_specular/反射高光const GLfloat light_position数据结构:循环型static void key(unsigned char key, int x, int y) switch (key) case 27 : case q: exit(0); break; case +: slices+; stacks+; break; case -: if (slices3 & stacks3) slices-; stacks-; break; glutPostRedisplay();2.3 函数实现

5、调用多个绘图函数,画出九个自动旋转图形。 改变各函数的不同数据,可以改变图形形状,图形颜色,图形旋转等功能。 绘图函数:glPushMatrix();/将当前矩阵压入堆栈 glTranslated(-2.4,3.6,-6);/坐标位置 glRotated(0,1,0,0);/旋转矩阵 glRotated(a,1,0,1); glutWireTorus(0.2,0.8,slices,stacks);/线框圆环体 glPopMatrix();/将当前矩阵弹出堆栈 旋转自增:static void key(unsigned char key, int x, int y) switch (key) c

6、ase 27 : case q: exit(0); break; case +: slices+; stacks+; break; case -: if (slices3 & stacks3) slices-; stacks-; break; glutPostRedisplay();光影响效果函数:const GLfloat light_ambient = 0.0f, 0.0f, 0.0f, 1.0f ;/环境光源const GLfloat light_diffuse = 1.0f, 1.0f, 1.0f, 1.0f ;/漫发射光const GLfloat light_specular = 1

7、.0f, 1.0f, 1.0f, 1.0f ;/反射高光const GLfloat light_position = 2.0f, 5.0f, 5.0f, 0.0f ;2.4 开发日志2013-6-13(农历二一三年五月初六) 16:42程序修改完.3 程序调试及运行3.1 程序运行结果九个不同图形自动旋转.3.2 程序使用说明使用前必须将下载GLUT 并放在指定位置3.3 程序开发总结注意函数调用,合理安排每个图形的位置及大小,否则会出现图形重叠,交叉.合理安排图形旋转.谨慎处理数据。4 附件(源程序)/* * GLUT Shapes Demo * * Written by Nigel Ste

8、wart November 2003 * * This program is test harness for the sphere, cone * and torus shapes in GLUT. * * Spinning wireframe and smooth shaded shapes are * displayed until the ESC or q key is pressed. The * number of geometry stacks and slices can be adjusted * using the + and - keys. */#include#ifde

9、f _APPLE_#include #else#include #endif#include static int slices = 8;static int stacks = 8;/* GLUT callback Handlers */static void resize(int width, int height) const float ar = (float) width / (float) height; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION);/指定投影矩阵定义修剪空间 glLoadIdentity(

10、);/加载单位矩阵 glFrustum(-ar, ar, -1.0, 2.0, 2.0, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity() ;/加载单位矩阵static void display(void) const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0; const double a = t*90.0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3d(0.6,0.3,0.7);/设置绘图颜色 glPush

11、Matrix();/将当前矩阵压入堆栈 glTranslated(-2.4,3.6,-6);/坐标位置 glRotated(0,1,0,0);/旋转矩阵 glRotated(a,1,0,1); glutWireTorus(0.2,0.8,slices,stacks);/线框圆环体 glPopMatrix();/将当前矩阵弹出堆栈 glPushMatrix(); glTranslated(0,3.6,-6); glRotated(0,1,0,0); glRotated(a,1,0,1); glutSolidTorus(0.2,0.8,slices,stacks); glPopMatrix();

12、glPushMatrix(); glTranslated(2.4,3.6,-6); glRotated(0,1,0,0); glRotated(a,1,0,1); glutWireCube(1); glPopMatrix(); glPushMatrix(); glTranslated(-2.4,1.2,-6); glRotated(0,1,0,0); glRotated(a,1,0,1); glutWireTeapot(1); glPopMatrix(); glPushMatrix(); glTranslated(0,1.2,-6); glRotated(60,1,0,0); glRotate

13、d(a,2,0,1); glutWireOctahedron(); glPopMatrix(); glPushMatrix(); glTranslated(2.4,1.2,-6); glRotated(60,1,0,0); glRotated(a,2,0,1); glutWireSphere(1,slices,stacks); glPopMatrix(); glPushMatrix(); glTranslated(-2.4,-1.2,-6); glRotated(60,1,0,0); glRotated(a,2,0,1); glutSolidTeapot(1); glPopMatrix();

14、glPushMatrix(); glTranslated(0,-1,-6); glRotated(60,1,0,0); glRotated(a,1,0,1); glutSolidOctahedron(); glPopMatrix(); glPushMatrix(); glTranslated(2.4,-1.2,-6); glRotated(60,1,0,0); glRotated(a,2,0,1); glutSolidSphere(1,slices,stacks); glPopMatrix(); glutSwapBuffers();static void key(unsigned char k

15、ey, int x, int y) switch (key) case 27 : case q: exit(0); break; case +: slices+; stacks+; break; case -: if (slices3 & stacks3) slices-; stacks-; break; glutPostRedisplay();static void idle(void) glutPostRedisplay();const GLfloat light_ambient = 0.0f, 0.0f, 0.0f, 1.0f ;const GLfloat light_diffuse =

16、 1.0f, 1.0f, 1.0f, 1.0f ;const GLfloat light_specular = 1.0f, 1.0f, 1.0f, 1.0f ;const GLfloat light_position = 2.0f, 5.0f, 5.0f, 0.0f ;const GLfloat mat_ambient = 0.7f, 0.7f, 0.7f, 1.0f ;const GLfloat mat_diffuse = 0.8f, 0.8f, 0.8f, 1.0f ;const GLfloat mat_specular = 1.0f, 1.0f, 1.0f, 1.0f ;const GL

17、float high_shininess = 100.0f ;/* Program entry point */int main(int argc, char *argv) glutInit(&argc, argv); glutInitWindowSize(700,600);/视窗大小 glutInitWindowPosition(10,10);/视窗位置 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow(GLUT Shapes); glutReshapeFunc(resize); glutDi

18、splayFunc(display); glutKeyboardFunc(key); glutIdleFunc(idle); glClearColor(1,1,1,1); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glEnable(GL_LIGHT0); glEnable(GL_NORMALIZE); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0, GL_A

19、MBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_S

20、PECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess); glutMainLoop(); return EXIT_SUCCESS;学 院电子信息学院班 级学 号 姓 名摘要:编写大数阶乘源码。目录1 摘要 31.1 设计题目 31.2 设计内容 31.3 开发工具 31.4 应用平台 32 详细设计 32.1 程序结构 32.2 主要功能 32.3 函数实现 42.4 开发日志 43 程序调试及运行 43.1 程序运行结果 43.2 程序使用说明 43.3 程序开发总结 54 附件(源程序) 5/

21、*在后面的文档编写中,请你不要修改各个标题的内容,从而确保报告内容和风格一致。完成全部内容后,你只需要在上面的目录上右键“更新域”,选择“只更新页码”就可以更新正确的目录页码。注意:目录的左边距为6.5厘米。*/1 摘要1.1 设计题目编写常用算法的演示程序1.2 设计内容大数阶乘源码1.3 开发工具Codeblocks1.4 应用平台Windows 2000/XP 32位2 详细设计2.1 程序结构程序有三大部分组成,一部分是主函数,另两部分是另外两种函数。2.2 主要功能主函数负责将n输入,并通过对另外两个函数的调用实现对n的阶乘的计算。2.3 函数实现在计算大数阶乘的过程中,乘数一般不是

22、一位数字,计算的时候可以稍作变通,将上次的进位加上本次的积得到数P,将P除以10的余数做为结果的本位,将P除以10的商作为进位。当被乘数的所有数字都和乘数相乘完毕后,将进位C放在积的最前面即可。根据此原理编写函数。一个m位数乘以n位数,其结果为m+n-1,或者m+n位,所以需首先定义一个至少m+n个元素的数组,并置前n位为0。计算一个m位的被乘数乘以一个n位的整数k,积仍存储于数组avoid mul(unsigned char a,unsigned long k,int m,int n) int i; unsigned long p; unsigned long c=0; for ( i=m+

23、n-1; i=n;i-) p= ai * k +c; ai=(unsigned char)( p % 10); c= p / 10; while (c0) ai=(unsigned char)( c % 10); i-; c /=10; int main(int argc, char* argv) int i; unsigned char a=0,0,0,2,3,4,5; mul(a,678,4,3); i=0; while ( ai=0) i+; for (;i4+3;i+) printf(%c,ai+0); /由于数ai(0=ai =9)对应的可打印字任符为0到9,所以显示为i0 retu

24、rn 0; 从上面的例子可知,在做乘法之前,必须为数组保留足够的空间。具体到计算n!的阶乘时,必须准备一个能容纳的n!的所有位数的数组或者内存块。即数组采有静态分配或者动态分配。前者代码简洁,但只适应于n小于一个固定的值,后者灵活性强,只要有足够的内存,可计算任意n的阶乘,我们这里讨论后一种情况,如何分配一块大小合适的内存。n!有多少位数呢?我们给出一个近似的上限值:n! (n+1)/2的n次方,下面是推导过程。Caes 1: n是奇数,则中间的那个数mid= (n+1)/2, 除了这个数外,我们可以将1到n之间的数分成n/2组,每组的两个数为 mid-i和mid+i (i=1到mid-1),

25、如1,2,3,4,5,6,7 可以分为数4,和3对数,它们是(3,5),(2,6)和(1,7),容易知道,每对数的积都于小mid*mid,故n!小于(n+1)/2 的n的次方。Case 2: n 是个偶数,则中间的两个数(n1)/2和(n+1)/2, 我们将(n+1)/2记做mid,则其它的几对数是(mid-2,mid+1),(mid-3)(mid+2)等等,容易看出,n!小于mid 的n次方。由以上两种情况可知,对于任意大于1的正整数n, n!12时,数据会溢出,如果改成定义为double型,n170时,数据也会溢出),所以要用数组储存阶乘得到的数据。4 附件(源程序)#include st

26、dio.h#include stdlib.h#include memory.h#include math.h#include malloc.hvoid calcFac(unsigned long n) unsigned long i,j,head,tail; int blkLen=(int)(n*log10(n+1)/2); /计算n!有数数字的个数 blkLen+=4; /保险起见,多加4位 if (n=1) printf(%d!=0/n,n); return; char *arr=(char *)malloc(blkLen); if (arr=NULL) printf(alloc memo

27、ry fail/n); return ; memset(arr,0,sizeof(char)*blkLen); head=tail=blkLen-1; arrtail=1; for (i=2;i=head;j-) unsigned long prod=arrj*i+c; arrj=(char)(prod%10); c= prod /10; while (c0) head-; arrhead=(char)(c % 10); c/=10; printf(%d!=,n); for (i=head;i=tail;i+) printf(%c,arri+0); printf(n); free(arr);void testCalcFac() int n; while (1) printf(n=?); scanf(%ld,&n); if (n=0) break; calcFac(n); int main(int argc, char* argv) testCalcFac(); return 0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1