一、设计内容与设计要求1.设计内容:弹跳的球体:一个着色的三维球体,沿着一条给定的轨道(正弦衰弱曲线)不断弹跳并同时翻滚,要求按ESC停止转动翻滚按↑加快弹跳速度,按↓减慢弹跳速度。2.设计要求:在屏幕上不断地连续弹跳并同时翻滚,按↑加快移动速度,按↓减慢移动速度。3.算法提示:可用绘制三维曲面(规则曲面、参数方程为:x=Rsin(α)cos(β),y=Rsin(α)sin(β),z=Rcos(α),0≤α≤180,0≤β≤360)来设计球体的形状,用轴测图将它绘制到屏幕上,并对球面上的小方格进行填充,选择5—10个不同方位的球体图形用getimage()命令将它们的图象保存;对以后路径上的图形只需用命令Putimage()调出即可。其轨迹方程为:z=A|sin(ωr+θ)|e-krr=(x2+y2)1/2。二、进度安排第3周星期一8:00——12:00星期二8:00——12:00星期三8:00——12:00星期四8:00——12:00星期五8:00——12:00第4周星期一8:00——12:00目录一、课题的主要功能.....................................................................................1二、课题的功能模块的划分..........................................................................1三、主要功能的实现.....................................................................................11、功能实现...........................................................................................12、流程图...............................................................................................2四、程序调试................................................................................................2五、总结........................................................................................................3六、附件........................................................................................................3计算机与通信学院课程设计评分表.......................................................91一、课题的主要功能本课题实现了一个着色的三维球体,沿着一条给定的轨道(正弦衰弱曲线)不断弹跳,控制键为W键和X键,按W键使运动加速,按X键使运动减速。并且着色球体在屏幕上连续不断的按照给定的曲线函数跳动,且三维球体自身也要进行翻滚。二、课题的功能模块的划分该程序主要分为三个部分:1、键盘控制部分:该部分主要是实现对键盘控制的操作,按W键加快三维球体的运动速度,按X键能减慢球体的运动速度。2、球体运动轨迹设计部分:主要是确定球体在屏幕上的运动轨迹。3、球体绘制部分:该部分主要是绘制一个着色的三维球体,并控制其自身翻滚所沿其经纬度设定。三、主要功能的实现1、功能实现该程序的主要功能我已基本实现,三维球体在屏幕上按照程序给定的正弦衰弱曲线轨道进行跳动并翻转,通过球体经纬度和球体绿色部分的旋转就可以看出来。当我们从键盘上输入‘W’时球体就会加快运动,并显出字符‘PAGEUP’;当我们从键盘上输入‘X’时球体就会减慢运动,并显出字符‘PAGEDOWN’。跳动的球体keyboard(int)convey(void)sphere(float,float,float)22、流程图键盘控制部分:YWXN四、程序调试kbhit()ch=getch()speed=1000-t2*50speed=1000+t4*100chSleep(speed)3五、总结为了这个程序,我真的发了很多心思,其中有很多问题是我不会的,我需要花时间去学习和编程,中间会出现问题,比如在怎样在二维平面上绘制三维球体、球体颜色的填充、球体自身的翻滚等,如果想认真完成这次课设,这些是需要我一步一步解决的。实际上,在弄懂了程序功能原理的基础上,我们的时间是充余的,做一个粗糙的程序体出来应该是游刃有余的,如果说创新对于我们来说是件难事,那改良总是有可能的。就像这次我做这个课设时,为了解决问题我仔细的研究老师给的那几个参考例子,并且也借鉴了书上的一些功能函数。对于课程设计,总的一句话就是要动手,只有自己动手了,书本是那个学的知识才能融会贯通,才能应用与实际。这个程序所需要的一些基本功能我已经实现啦,但是做工还是有点粗糙,因为自己的能力水平也有限,而且时间有限,我就只能做到这样啦。到了大四,可以说经过了无数次实验和课设,给我最深的回忆是每次自己独立写出程序的那种快感,这种感觉是不编程人无法体会的,我很庆幸过了四年我这点还没有丢失掉,或许这是我这大学四年留下的最美好的回忆。六、附件#includestdio.h#includeconio.h#includegraphics.h/*图形系统头文件*/4#includemath.h/#includestdlib.h#includewindows.h#definePI3.14159longintspeed=1000;intA=50;floatw=0.2;staticdoubleyy=0.0,xx=0.0;charch;voidconvey()/*轨迹方程函数*/{xx=xx+10.0;yy=200-A*sin(w*xx);if(xx=500&&yy=400){xx=10.0;yy=0.0;}/*设置球体运动的最大坐标*/return;}voidquittime01(intt2)/*按w键加速球体运动*/{printf(PAGEUP\n);speed=1000-t2*50;Sleep(speed);return;}voidquittime02(intt4)/*按x键减速球体运动*/{printf(PAGEDOWN\n);5speed=1000+t4*100;Sleep(speed);return;}voidkeyboard(intt1)/*定义判断是否按键控制速度函数*/{if(kbhit())/*判断是否按键*/{ch=getch();switch(ch){case'w':{quittime01(t1);/*调用quittime01()函数*/return;}case'x':{quittime02(t1);return;}default:break;}}else{Sleep(speed);return;}}voidsphere(floatR,intalfa,intbeta){/*R为球体半径,alfa、beta分别为半径与经纬线的夹角*/6floatx[4],y[4],z[4];/*定义旋转变换前点坐标数组*/floatx1[4],z1[4];/*定义旋转变换后点坐标数组*/inti,j,k;floatsx[4],sy[4];intshfill[10];/*定义存放了5个顶点坐标序列的数组*/doubleyn;doublea1,a2,b1,b2,c,d;c=alfa*PI/180.0;/*每次旋转的角度*/d=beta*PI/180.0;cleardevice();for(j=0;j180;j=j+20){a1=j*PI/180.0;a2=(j+20)*PI/180.0;for(i=0;i360;i=i+20){b1=i*PI/180;b2=(i+20)*PI/180;x[0]=R*sin(a1)*cos(b1);/*求出图形旋转前点的坐标*/y[0]=R*sin(a1)*sin(b1);z[0]=R*cos(a1);x[1]=R*sin(a2)*cos(b1);y[1]=R*sin(a2)*sin(b1);z[1]=R*cos(a2);x[2]=R*sin(a2)*cos(b2);y[2]=R*sin(a2)*sin(b2);z[2]=R*cos(a2);x[3]=R*sin(a1)*cos(b2);y[3]=R*sin(a1)*sin(b2);z[3]=R*cos(a1);for(k=0;k4;k++)/*求出图形旋转后点的坐标*/7{x1[k]=x[k]*cos(c)-y[k]*sin(c);z1[k]=-x[k]*sin(c)*sin(d)-y[k]*cos(c)*sin(d)+z[k]*cos(d);sx[k]=100-x1[k]+xx;/*将三维坐标转化为屏幕坐标*/sy[k]=100-z1[k]+yy;}yn=-(x1[2]-x1[0])*(z1[3]-z1[1])+(x1[3]-x1[1])*(z1[2]-z1[0]);if(yn=0.0)/*对可见部分进行画线,实现消隐*/{moveto(sx[0],sy[0]);lineto(sx[1],sy[1]);lineto(sx[2],sy[2]);lineto(sx[3],sy[3]);lineto(sx[0],sy[0]);shfill[0]=(int)sx[0],shfill[1]=(int)sy[0];shfill[2]=(int)sx[1],shfill[3]=(int)sy[1];shfill[4]=(int)sx[2],shfill[5]=(int)sy[2];shfill[6]=(int)sx[3],shfill[7]=(int)sy[3];shfill[8]=(int)sx[0],shfill[9]=(int)sy[0];if(i==20)/*对一段经曲面进行填充*/{setfillstyle(1,GREEN);}elsesetfillstyle(1,RED);fillpoly(5,shfill);/*用当前颜色填充多边形*/}}}}voidmain()8{intgdrive=DETECT,gmode,t;initgraph(&gdrive,&gmode,);/*初始化图形系统*/cleardevice();setcolor(WHITE);/*设置当前画笔颜色为白色*/sphere(50,80,30);//调用sphere函数outtextxy(400,20,Pressanykeytostart!);getch();for(t=0;t=45;t++){cleardevice();sphere(50,t*10,0);keyboard(t);convey();}getch();closegraph();/*关闭图形系统*/}9计算机与通信学院课程设计评分表课题名称:弹跳的球体项目评价设计方案的合理性与创造性设计与调试结果设计说明书的质量答辩陈述与回答问题情况课程设计周表现情况综合成绩教师签名:日期: