1、做出九个旋转图形,利用光影效果制作不同旋转。1.3 开发工具Code blocks1.4 应用平台Windows 2000/XP 32位2 详细设计2.1 程序结构头文件,静态变量,函数定义,函数调用,主函数。循环型数据结构。2.2 主要功能绘出圆环,茶壶,球,正八面体,线框和实体,还有线框立方体以及自动旋转. 改变各函数的不同数据,可以改变图形形状,图形颜色,图形旋转等功能。原理:glTranslated函数确定每个图形位置;glColor3d(0.6,0.3,0.7);/设置绘图颜色图函数,绘图函数:glPushMatrix();/将当前矩阵压入堆栈 glTranslated(-2.4,3
2、.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 light_diffuse ;/漫发射光const GLfloat light_specular/反射高光const GLfloat light_position数据结构:循环型stat
3、ic void key(unsigned char key, int x, int y) switch (key) case 27 : case q: exit(0); break;+ slices+; stacks+;- if (slices3 & stacks3) slices-; stacks-; glutPostRedisplay();2.3 函数实现调用多个绘图函数,画出九个自动旋转图形。 改变各函数的不同数据,可以改变图形形状,图形颜色,图形旋转等功能。绘图函数: 旋转自增:const GLfloat light_diffuse = 1.0f, 1.0f, 1.0f, 1.0f ;
4、const GLfloat light_specular = 1.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 Shap
5、es Demo * * Written by Nigel Stewart 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 +
6、 and - keys. */#include#ifdef _APPLE_#include #elseGL/glut.h#endifstdlib.hstatic 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);/指
7、定投影矩阵定义修剪空间 glLoadIdentity();/加载单位矩阵 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
8、,0.7);/设置绘图颜色 glPushMatrix(); glTranslated(0,3.6,-6); glutSolidTorus(0.2,0.8,slices,stacks); glTranslated(2.4,3.6,-6); glutWireCube(1); glTranslated(-2.4,1.2,-6); glutWireTeapot(1); glTranslated(0,1.2,-6); glRotated(60,1,0,0); glRotated(a,2,0,1); glutWireOctahedron(); glTranslated(2.4,1.2,-6); glutW
9、ireSphere(1,slices,stacks); glTranslated(-2.4,-1.2,-6); glutSolidTeapot(1); glTranslated(0,-1,-6); glutSolidOctahedron(); glTranslated(2.4,-1.2,-6); glutSolidSphere(1,slices,stacks); glutSwapBuffers();static void idle(void)const GLfloat mat_ambient = 0.7f, 0.7f, 0.7f, 1.0f ;const GLfloat mat_diffuse
10、 = 0.8f, 0.8f, 0.8f, 1.0f ;const GLfloat mat_specular = 1.0f, 1.0f, 1.0f, 1.0f ;const GLfloat 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 | G
11、LUT_DOUBLE | GLUT_DEPTH); glutCreateWindow(GLUT Shapes); glutReshapeFunc(resize); glutDisplayFunc(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_N
12、ORMALIZE); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0, GL_AMBIENT, 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, ma
13、t_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess); glutMainLoop(); return EXIT_SUCCESS;编写大数阶乘源码。1.1 设计题目编写常用算法的演示程序大数阶乘源码Codeblocks程序有三大部分组成,一部分是主函数,另两部分是另外两种函数。主函数负责将n输入,并通过对另外两个函数的调用实
14、现对n的阶乘的计算。在计算大数阶乘的过程中,乘数一般不是一位数字,计算的时候可以稍作变通,将上次的进位加上本次的积得到数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; u
15、nsigned long c=0; for ( i=m+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) 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)对应的可打印
16、字任符为0到9,所以显示为i0 return 0; 从上面的例子可知,在做乘法之前,必须为数组保留足够的空间。具体到计算n!的阶乘时,必须准备一个能容纳的n!的所有位数的数组或者内存块。即数组采有静态分配或者动态分配。前者代码简洁,但只适应于n小于一个固定的值,后者灵活性强,只要有足够的内存,可计算任意n的阶乘,我们这里讨论后一种情况,如何分配一块大小合适的内存。n!有多少位数呢?我们给出一个近似的上限值: (n+1)/2的n次方,下面是推导过程。Caes 1: n是奇数,则中间的那个数mid= (n+1)/2, 除了这个数外,我们可以将1到n之间的数分成n/2组,每组的两个数为 mid-i和
17、mid+i (i=1到mid-1),如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时,数据也会溢出),所以要用数组储存阶乘得到的数据。#i
18、nclude stdio.hstdlib.hmemory.hmath.hmalloc.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=head;j-) unsigned long prod=arrj*i+c; arrj=(char)(prod%10); c= prod /10; head-; arrhead=(char)(c % 10); c/=10;= for (i=head;=tail;,arri+0n free(arr);void testCalcFac() int n; while (1)n=? scanf(%ld,&n); if (n=0) calcFac(n); testCalcFac();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1