《《计算机程序训练》设计说明书》由会员分享,可在线阅读,更多相关《《计算机程序训练》设计说明书(10页珍藏版)》请在金锄头文库上搜索。
1、 计算机程序训练 设计说明书指导老师:王瑛 姓名:刘 开学号 0805020201日期:2010-6-17一、题目编制曲线轨迹动画程序画一圆的外摆线,使小五角星在曲线轨迹上移动,tbbabtbaxcoscos)(tbbabtbaysinsin)(a,b,t由键盘输入,输入的数据送文件保存,按回车键程序结束(功能延伸:改变数据文件的内容后,再根据数据文件里的数据绘制外摆线)二、问题描述:1、画一圆的外摆线,摆线方程如下:tbbabtbaxcoscos)(tbbabtbaysinsin)(2、a,b,t由键盘输入,输入的数据送文件保存,按回车键程序结束。3、画一个五角星。4、使小五角星在曲线轨迹上
2、移动5、功能延伸:改变数据文件的内容后,再根据数据文件里的数据绘制外摆线三、系统设计说明一) 、系统用到的功能分析:程序设计一般由两部分组成:算法设计和数据结构,合理地选择和实现一个程序结构和处理这些数据结构有同样的重要性,主要包括如下:#include /*图形处理函数*/#include /*插入数学头文件 */#include /*磁盘输出函数*/#include /*标准库函数*/#define PI 3.1415926 /* 宏定义 PI*/ float th=PI/180 /*定义全局变量 th */struct canshuint a;int b;int t;canshu; /*
3、定义全局变量*/float period; /*定义全局变量*/1.main()主函数主函数中调用scanf()函数,实现数据的输入,并通过调用save() ,实现文件的保存,通过调用drawcurve() ,画出圆的外摆线,通过调用star()画出五角星,通过for循环不断改变传入star的值,实现五角星在外摆线是上的运动。2、save()文件写入函数前面讲到的数据输入和输出是以中端为对象的,当程序关闭后,数据也丢失了,所以为了能随时查阅数据,必须将数据输出到磁盘文件上保存起来,使用时再从磁盘中读入到内存中,这就用到了磁盘文件的读写操作。3、drawcurve()画圆外摆线函数从主函数传入大
4、圆和小圆半径,利用函数关系确定外摆线上每个点得坐标,并依次利用lineto()函数将其连接,最终画出外摆线图形。4、star()画出五角星函数从主函数传入五角星中心的坐标及大小和初始角度,通过for循环寻找五角星各个角点坐标,用line()函数按规律连接线条,画出五角星,调用floodfill函数对五角星填色.5、period()求周期函数利用几何关系计算外摆线上点坐标变动周期。6、getchar()从终端输入一个字符通过判断输入的字符判断是否需要重新输入a,b,t的值7、delay()时间延迟函数通过调用该函数确定五角星在摆线上运动速度的快慢8、cleardevice()清屏函数擦除整个图形
5、屏幕并将光标移到原点9、line()画直线函数用当前颜色当前画线类型和宽度,在所示坐标之间画一条直线不修改光标当前位置,10、floodfill()图形填充函数用当前选定的刷子在指定的设备场景中填充一个区域。区域是由颜色crColor定义的二) 、系统包括的功能模块,模块功能描述,各模块间的层次结构(即相互调用关系)以及模块之间的信息交换问题。1、本程序是一个简单的动画程序,2、程序实现如下功能:创建磁盘文件并保存写入磁盘的值,绘制图的外摆线,和运动的五角星,按回车结束。 、功能流程图3、功能流程图:传入函数 xf()和.yf()确定外摆线 上各点坐标开始:实现数据输入并将数据送磁 盘保存调用
6、数据利用函数关系不断改变五角星的中 心坐标坐标值传入 drawcurve(),画出圆的 外摆线调用 star()函数画出运动的五角星按回车键结束程序三、算法设计1、主函数中调用scanf()函数,实现数据的输入。2、通过调用save() ,实现文件的保存。3、通过调用drawcurve() ,画出圆的外摆线。4、通过调用star()画出五角星。5、通过for循环不断改变传入star的值,实现五角星在外摆线是上的运动。四、参考文献1、 计算机绘图刘静华、王永生主编,新编计算机绘图。北京航空航天大学出版社,1998。2、 计算机图形学何援军著。机械工业出版社 2006-01-01 版。3、网络书库
7、:。五、源程序代码#include#include /* 插入数学头文件 */#include#include#define PI 3.1415926 /* 宏定义 PI */float th=PI/180; /*定义全局变量 th */struct canshuint a;int b;int t;canshu;float period=2*PI;int xf(float T) int f;f=320+(canshu.a+canshu.b)*cos(T)-canshu.b*cos(canshu.a+canshu.b)/canshu.b*T);return(f);int yf(float T)i
8、nt f;f=200-(canshu.a+canshu.b)*sin(T)-canshu.b*sin(canshu.a+canshu.b)/canshu.b*T);return(f);void drawcurve()float A,step;A=0;step=PI/540;doA=A+step;putpixel(xf(A),yf(A),WHITE);while(Aperiod)|(A=period);void main()FILE *fp; /*文件指针*/int a,b,t;int x,y,r,theta;void save();int gd=DETECT,gm;initgraph(prin
9、tf(“if you want input,please press y,if you want to call saved file,press anykeyn“);if(getchar()=y)printf(“please input the a b t:n“);scanf(“%d%d%d“,canshu.a=a;canshu.b=b;canshu.t=t;save();elsefp=fopen(“d:canshu_list“,“rb“);fread(a=canshu.a;b=canshu.b;t=canshu.t;fclose(fp);cleardevice();setbkcolor(B
10、LUE);r=a/2;theta=90;star(320,200,r,theta);for(;!kbhit();)drawcurve();x=320+(a+b)*cos(t*th)-b*cos(a+b)/b*t*th);y=200-(a+b)*sin(t*th)-b*sin(a+b)/b*t*th);star(x,y,r,theta);t=t+180/60;delay(1000);cleardevice();star(int x,int y,int r,int theta)int r0=r*sin(18*th)/cos(36*th); /*计算小圆半径 r0 */int i,color;int
11、 x16,y16,x26,y26;for(i=0;i6;i+)x1i=x+r*cos(theta+i*72)*th); /* 计算出大圆上的五个平均分布点的坐标*/y1i=y-r*sin(theta+i*72)*th);x2i=x+r0*cos(theta-36)+i*72)*th); /* 计算出小圆上的五个平均分布点的坐标*/y2i=y-r0*sin(theta-36)+i*72)*th);setcolor(RED);for(i=0;i5;i+) /* 将相应的点用线连接起来。*/line(x,y,x1i,y1i);line(x,y,x2i,y2i);line(x1i,y1i,x2i,y2i);line(x1i,y1i,x2i+1,y2i+1);for(i=0;i10;i+) /* 分别填充相应部位,形成立体效果*/setfillstyle(1,i%2?RED:LIGHTRED);floodfill(x+10*cos(theta-90+i*36)*th),y-10*sin(theta-90+i*36)*th),RED);void save() /*保存文件函数*/FILE *fp;if(fp=fopen(“d:canshu_list“,“wb“)=NULL)printf(“cannot open filen“);exit(0);if(fwrite(fclose(fp);