计算机图形学课程设计--- 弹跳的彩球动画
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计任务书题目:弹跳的彩球动画
课程设计任务书及成绩评定
目录
一、摘要 (1)
二、总体设计方案及主要设计原理 (2)
1.功能实现 (2)
2.流程图 (2)
2.1函数qiu的流程图 (2)
2.2绘制球体的程序流程图 (2)
2.3主程序流程图 (4)
3.主要算法 (4)
三、源程序代码 (5)
四、测试及分析 (10)
五、结束语 (11)
一、摘要
本课题实现一个着色的三维小球在一定的空间内按照一条给定的轨道(正弦衰弱曲线)不断弹跳并同时翻滚。
控制键为按ESC退出程序,按“↑”键完成运动加速,使得三维小球加快弹跳速度;按“↓”键完成运动减速,使得三维小球减慢弹跳速度。
并且小球在屏幕中连续不断的按照给定的曲线函数跳动,且三维小球自身也要进行翻滚。
该程序的主要模块分为如下部分:
操作控制部分:该部分主要是实现对屏幕的操作,达到功能要求中按“ESC”结束程序,按“↑”
加快三维小球运动,按“↓”减慢三维小球的运动。
球体绘制部分:该部分实现三维小球的绘制,其具体的是对三维球体的形状、大小、经纬线、以及在三维球体中填充颜色。
球体运动轨迹控制部分:该部分是确定球体在屏幕上的运动轨迹,从而达到程序要求的功能。
通过该部分,我们可以任意的对球体的运动轨迹进行设定,使得三维小球的运动丰富多彩。
背景控制部分:通过该部分,我们可以设定三维小球在什么样的背景下运动,对颜色的组合,使得背景更加丰富,从而完善程序的运行界面,达到美观的作用。
二、总体设计方案及主要设计原理
1.功能实现
通过运行程序,我们看到该程序的功能我们已经基本实现,当我们在三维小球在屏幕中按照预先给定的曲线函数路线进行运动,当我们从键盘输入“↑”时三维小球就加速运动。
当我们从键盘输入“↓”时,椭球体减速运动,按下“ESC”键就退出程序,最终达到了功能要求的目的。
2.流程图
2.1函数qiu的流程图
如图1所示为函数qiu的流程图:
图1:函数qiu的流程图
2.2绘制球体的程序流程图
如图2、图3示为程序绘制球体的流程图:
图2:球体绘制程序流程图1
图3:球体绘制程序流程图2
2.3主程序流程图
图4:主程序流程图
3.主要算法
可用绘制三维曲面(规则曲面、参数方程为:x=Rsin(α)cos(β), y=Rsin(α)sin(β), z=Rcos(α),0≤α≤180,0≤β≤360)来设计球体的形状,用轴测图将它绘制到屏幕上,并对球面上的小方格进行填充,选择5—10个不同方位的球体图形用getimage()命令将它们的图象保存;
对以后路径上的图形只需用命令Putimage()调出即可。
其轨迹方程为:
z=A|sin(ωr+θ)|e-kr r=(x2+y2)1/2。
三、源程序代码
#include"math.h"
#include"graphics.h"
#include"bios.h"
#include"conio.h"
#define ESC 283
#define PAGEUP 18688
#define PAGEDOWN 20736
double f[4][4],xx,yy,zz,dd;
double x0[40][40],y0[40][40],z0[40][40];
int x[40][40],y[40][40],z[40][40],this;
int scx(double xj)
{
int x;
x=(int)(xj+40);
return(x);
}
int scy(double yj)
{
int y;
y=(int)(yj+60);
return(y);
}
void teq(double theta)
{
double th;
th=theta*3.14159/180;
f[0][0]=0.87*cos(th); f[0][1]=0.0; f[0][2]=-0.35*cos(th)-0.71*sin(th); f[0][3]=0.0;
f[1][0]=-0.5; f[1][1]=0.0; f[1][2]=-0.61; f[1][3]=0.0;
f[2][0]=0.87*sin(th); f[2][1]=0.0; f[2][2]=-0.35*sin(th)+0.71*cos(th); f[2][3]=0.0;
f[3][0]=0.0; f[3][1]=0.0; f[3][2]=0.0; f[3][3]=1.0;
}
double affine3x(double x,double y,double z,double d)
{
xx=x*f[0][0]+y*f[1][0]+z*f[2][0]+d*f[3][0];
return(xx);
}
double affine3z(double x,double y,double z,double d)
{
zz=x*f[0][2]+y*f[1][2]+z*f[2][2]+d*f[3][2];
return(zz);
}
void draw()
{
int i,j,m[8],rt;
setfillstyle(1,RED);
for(i=9;i>=0;i--)
for(j=19;j>=0;j--)
{
if(j%2==1)
{
setfillstyle(1,RED);
}
else setfillstyle(1,BLUE);
m[0]=scx(x0[i][j]);m[1]=scy(z0[i][j]);
m[2]=scx(x0[i+1][j]);m[3]=scy(z0[i+1][j]);
m[4]=scx(x0[i+1][j+1]);m[5]=scy(z0[i+1][j+1]);
m[6]=scx(x0[i][j+1]);m[7]=scy(z0[i][j+1]);
fillpoly(4,m);
}
}
void qiu()
{
double a=0.0,b=0.0;
int r=30;
int i=0,j=0,th;
for(i=0;i<=10;i++)
{
for(j=0;j<=20;j++)
{
x[i][j]=r*sin(a)*cos(b);
y[i][j]=r*sin(a)*sin(b);
z[i][j]=r*cos(a);
b=b+3.14159/10;
}
a=a+3.14159/10;
b=0;
}
}
qiu1(int th,int u,int v)
{
int i,j;
this=this+th;
teq(this);
for(i=0;i<=15;i++)
for(j=0;j<=30;j++)
{
x0[i][j]=affine3x(x[i][j],y[i][j],z[i][j],1.0)+u;
z0[i][j]=affine3z(x[i][j],y[i][j],z[i][j],1.0)+v;
}
draw();
}
main()
{
int driver=VGA,mode=VGAMED;
initgraph(&driver,&mode," ");
qiu2();
closegraph();
}
qiu2()
{
int i=3,j=0,xw=0,yw=0,key,speed,dd=0,mm,xxw[200],yyw[200];
int
xp[26]={50,50,50,100,140,180,220,250,280,310,330,350,370,390,410,430,450,470,490,510,525,535 ,545,555,565};
int
yp[26]={0,0,0,200,50,50,200,100,100,200,150,150,200,170,170,200,180,180,200,200,200,200,200, 200,200};
int xa,xb,xc,xd;
int ya,yb,yc,yd;
double t=0.5,tt=0.05;
xa=xp[0];xb=xp[1];xc=xp[2];xd=xp[3];
ya=yp[0];yb=xp[1];yc=yp[2];yd=yp[3];
qiu();
outtextxy(100,100,"Press any key to start!");
qiu1(0,0,ya);
getch();
for(j=0;i<26;j++)
{if(bioskey(1)==0){
if(j%2==0)
{setvisualpage(0);
delay(10000);
setactivepage(1);
cleardevice();
setfillstyle(1,WHITE);
bar(0,260,700,320);
qiu1(-10,xw,yw);
if(t>=1)
{
xa=xp[i];xb=xp[i+1];xc=xp[i+2];xd=xp[i+3];
ya=yp[i];yb=yp[i+1];yc=yp[i+2];yd=yp[i+3];
t=0;
i=i+3;
}
xw=((-xa+3*xb-3*xc+xd)*t*t*t+(3*xa-6*xb+3*xc)*t*t+(-3*xa+3*xb)*t+xa);
yw=((-ya+3*yb-3*yc+yd)*t*t*t+(3*ya-6*yb+3*yc)*t*t+(-3*ya+3*yb)*t+ya);
t=t+tt;
xxw[dd]=xw+40;
yyw[dd]=yw+60;
for(mm=0;mm<dd;mm++)
{
line(xxw[mm],yyw[mm],xxw[mm+1],yyw[mm+1]);
}
dd++;
outtextxy(200,100,"press ESC to exit");
if(i>=26)
{
i=3;
j=0;
dd=0;
t=0.5;
xa=xp[0];xb=xp[1];xc=xp[2];xd=xp[3];
ya=yp[0];yb=yp[1];yc=yp[2];yd=yp[3];
cleardevice();
}
}
else
{
setvisualpage(1);
delay(10000);
setactivepage(0);
cleardevice();
setfillstyle(1,WHITE);
bar(0,260,700,320);
qiu1(-10,xw,yw);
if(t>=1)
{
xa=xp[i];xb=xp[i+1];xc=xp[i+2];xd=xp[i+3];
ya=yp[i];yb=yp[i+1];yc=yp[i+2];yd=yp[i+3];
t=0;
i=i+3;
}
xw=((-xa+3*xb-3*xc+xd)*t*t*t+(3*xa-6*xb+3*xc)*t*t+(-3*xa+3*xb)*t+xa);
yw=((-ya+3*yb-3*yc+yd)*t*t*t+(3*ya-6*yb+3*yc)*t*t+(-3*ya+3*yb)*t+ya);
t=t+tt;
xxw[dd]=xw+40;
yyw[dd]=yw+60;
for(mm=0;mm<dd;mm++)
{
line(xxw[mm],yyw[mm],xxw[mm+1],yyw[mm+1]);
}
dd++;
outtextxy(200,100,"press ESC to exit");
if(i>=26)
{ i=3;
j=0;
dd=0;
t=0.5;
xa=xp[0];xb=xp[1];xc=xp[2];xd=xp[3];
ya=yp[0];yb=yp[1];yc=yp[2];yd=yp[3];
cleardevice();
}
}
}
else {
key=bioskey(0);
switch(key)
{
case ESC:return;
case PAGEUP:tt=tt*2;
break;
case PAGEDOWN:tt=tt/2;
break;
defualt:break;
}
}
}
getch();
}
四、测试及分析
该程序是弹跳的小球,程序写完之后运行程序,会看到下面的界面:
接着按照提示进行操作,就会出现弹跳的小球的最终效果,见下图:
五、结束语
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.通过本次图形学的课程设计,我学会了很多东西。
以前那些似东非懂的知识,现在有很多已经掌握了,原来根本没听过的东西也明白了很多,而且使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,如对C语言的一些标准库函数不太了解,通过实践,使我在这几个方面的认识有所提高。
通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
图形学中二维图形处理的很重要的一块是裁剪。
裁剪的算法是三维图形处理中消隐的基本算法,也是大型图形处理中很重要的一块,对于算法的正确性,效率都有很高的要求。
在这次课程设计中,能够选择这个题目我很高兴。
学到了很多的知识。
也曾为了一些技术问题头疼过,但当我真的想出了一个可行的解决方案时,那种欣喜是无法用语言表达的。
不管怎么说,我觉得做这个课程设计,我是用了十分的努力的,我也从中获得了极大的满足。
这个图形学课程和课程设计,都带给了我很多知识,我在此感谢刘老师,您是一位很好的老师,教学认真,讲究方法,授人以渔而非授人以鱼,您是一位不可多得的好老师。