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