一个小圆使在其正八边形边上移动.docx
《一个小圆使在其正八边形边上移动.docx》由会员分享,可在线阅读,更多相关《一个小圆使在其正八边形边上移动.docx(11页珍藏版)》请在冰豆网上搜索。
![一个小圆使在其正八边形边上移动.docx](https://file1.bdocx.com/fileroot1/2022-11/27/b22a7767-c9ee-4ab3-b265-30b2c6d31abb/b22a7767-c9ee-4ab3-b265-30b2c6d31abb1.gif)
一个小圆使在其正八边形边上移动
一、题目
编制曲线轨迹动画程序
画一正八边形,如下图,再画一个小圆使在其正八边形边上移动。
八边形的大小和小圆移动的速度由键盘输入。
并将输入的数据送文件保存。
按回车键程序结束。
(功能延伸:
改变数据文件的内容后,再根据数据文件里的数据绘制正八边形)
二、问题描述:
本程序中要求一个小圆在正八边形上运动,其中小圆的速率和正八边形的大小可以自己确定。
本系统完成以下几方面的功能:
(1)画出正八边形和小圆。
(2)从键盘里输入正八边形外接圆的半径长和小圆在正八边形上的速率。
(3)显示小圆在正八边形上运动。
(4)存盘,将信息写入文件中”b:
\\canshu_list”
(5)再次从文件中直接读出程序,显示小圆在正八边形上运动。
三、系统设计说明
(一)系统功能分析:
1、程序设计一般由两部分组成:
算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性。
在曲线轨迹动画程序中,除了改变八边形的大小和速率,保存外,更多的是情况查询,所以用静态数组保存数据,实现查询。
主要包括如下:
#include"Conio.h"/*调用DOS控制台I/O子程序的各个函数*/
#include"graphics.h"/*说明有关图形功能的各个函数,图形错误代码的常量定义,正对不同驱动子程序的各种颜色值,及函数用到的一些特殊结构*/
#include
#include/*一些常用的子程序,转换子程序,收索,排序子程序等*/
#include/*定义和说明MSDOS和8086调用的一些常量和函数*/
#include/*数学计算*/
#definePI3.14159265/*用指定的标示符PI来代替“3.1415926”这个字符串*/
#definePNUM8/*用指定的标示符PNUM来代替“8”这个字符*/
structcanshu/*定义结构体画图所需要的参数*/
2、main()主函数
控制数据算法和图形运动两部分。
控制功能的实现通过循环执行,确定八边形的八个顶点和小圆的圆心,并不断地实现画图,已达到小圆在正八边形上运动。
3、initgr()
系统初始化
4、line()画直线函数
在指定两点简化一条直线。
5、printf()输出函数
直接利用输出函数printf输出字符串,在屏幕上显示提示输出选项。
6、circle()画圆函数
在指定圆心和半径的基础上画一个圆。
7、setcolor()
在指定的位置设置预定义的颜色。
8、save()文件写入函数。
前面讲到的数据输入和输出是以中端为对象的,当程序关闭后,数据也丢失了,所以为了能随时查阅数据,必须将数据输出到磁盘文件上保存起来,使用时再从磁盘中读入到内存中,这就用到了磁盘文件的读写操作。
(二)系统包括的功能模块,模块功能描述,各模块的层次结构结构(既相互调用关系)以及模块间的信息交换问题。
1、本程序是一个简单的曲线轨迹动画程序。
2、本程序实现的简单的如下功能:
画一个正八边形,再画一个小圆在上面移动,正八边形的大小又键盘输出,再将其数据保存在文件中,打开文件,调用其程序,退出。
3、创建曲线轨迹动画包括创建一个正八边形、一个小圆、综合操作使小圆在正八边形上运动。
(三)算法设计
1、确定正八边形外接圆的圆心。
2、确定正八边形的八个顶点,其中第一个点与第八个点重合。
3、顺序连接个点画出正八边形。
4、确定小圆的圆心。
5、小圆的圆心与正八边形的第一个顶点重合。
6、结合4和5不断地画正八边形,已实现小圆在正八边形上运动。
7、按y键,输入自己选择的正八边形的边长,和小圆在正八边形上运动的速率。
8、再按任何的其他键,直接显示程序的效果。
(四)结束语
当编译连接都正确时,进行运行:
在键盘里输入y,回车,再输入正八边形的外接圆的半径l和小圆在正八边形上运行的速率v,小圆就以一定速率在一定的正八边形上运动。
按回车键结束。
再次运行,按任何键,回车,显示结果将按照上次输入的数据进行,回车键结束。
通过《计算机程序设计》课程后,进行的一次全面的综合性上机实验。
为我们提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼我们的分析解决实际问题的能力。
提高我们适应实际,实践编程的能力
四、数据流程图
五、程序源代码
#include"Conio.h"/*调用DOS控制台I/O子程序的各个函数*/
#include"graphics.h"/*说明有关图形功能的各个函数,图形错误代码的常量定义,正对不同驱动子程序的各种颜色值,及函数用到的一些特殊结构*/
#include
#include/*一些常用的子程序,转换子程序,收索,排序子程序等*/
#include/*定义和说明MSDOS和8086调用的一些常量和函数*/
#include/*数学计算*/
#definePI3.14159265/*用指定的标示符PI来代替“3.1415926”这个字符串*/
#definePNUM8/*用指定的标示符PNUM来代替“8”这个字符*/
structcanshu/*定义结构体画图所需要的参数*/
{
intl;intv;
}canshu;structPOINT
{
intx;
inty;
}p[PNUM+1];
voidinitgr(void)/*程序初始化*/
{intgd=DETECT,gm=0;
initgraph(&gd,&gm,"");/*gd:
graphdriver,指定了要用驱动器程序;gm,即graphmode,说明了初始调色板模式,即调试办号*/
}
main()
{
inti,j,k,cx,cy,bx,by;
intl,v;/*定义变量的基本结构类型*/
FILE*fp;/*定义fp是指向文件的指针*/
voidsave();
printf("ifyouwantinput,pleasepressy,ifyouwanttocallsavedfile,pressanykey\n");
if(getchar()=='y')
{
printf("pleaseinputthel,v");
scanf("%d%d",&l,&v);
canshu.l=l;canshu.v=v;
save();
}
else
{
fp=fopen("d:
\\canshu_list","rb");
fread(&canshu,sizeof(structcanshu),1,fp);
l=canshu.l;v=canshu.v;
fclose(fp);
}
cx=200;/*正八边形外接圆的圆心*/
cy=200;
initgr();
for(i=0;i{
p[i].x=l*cos(PI/PNUM+i*PI/(PNUM/2))+cx;/*确定正八边
p[i].y=cy-l*sin(PI/PNUM+i*PI/(PNUM/2));每个顶点的坐标*/
}
p[PNUM].x=p[0].x;/*正八边形的最后一个顶点与第一个顶点重合*/
p[PNUM].y=p[0].y;
for(;!
kbhit();)
{
bx=p[0].x;/*保证小圆的圆心与正八边形的第一个点重合,不断的
by=p[0].y;画图,以实现小圆在正八边形上运动的动画*/
for(i=0;!
kbhit()&&i{
for(j=0;!
kbhit()&&j<2*l*sin(PI/PNUM);j++)/*小圆的圆心运行的路径要小于正八边形的边长*/
{
for(k=0;k<1000/v;k++)/*控制小圆运行的速率*/
delay(30);
setcolor(BLACK);/*背景颜色设为黑色*/
circle(bx,by,5);/*小圆的圆心和半径*/
setcolor(WHITE);/*小圆盒正八边形的颜色设为白色*/
for(k=0;kline(p[k].x,p[k].y,p[k+1].x,p[k+1].y);
/*在两点之间画一条直线*/
bx=p[i].x+j*(p[i+1].x-p[i].x)/(2*l*sin(PI/PNUM));
by=p[i].y+j*(p[i+1].y-p[i].y)/(2*l*sin(PI/PNUM));
/*确定小圆的圆心*/
circle(bx,by,5);
}
}
}
}
voidsave()
{
FILE*fp;
if((fp=fopen("d:
\\canshu_list","wb"))==NULL)
{printf("cannotopenfile\n");
exit(0);
}
if(fwrite(&canshu,sizeof(structcanshu),1,fp)!
=1)
printf("filewriteerror\n");
fclose(fp);
}
自己做
#include"graphics.h"
#include
#include
#definePI3.14159265
#definePNUM8
#defineEGAVGA_driver
structPOINT
{
intx;
inty;
}p[PNUM+1];
voidinitgr(void)
{intgd=DETECT,gm=0;
initgraph(&gd,&gm,"");
}
main()
{
inti,j,k,cx,cy,bx,by;
intl,v;
FILE*fp;
cx=200;
cy=200;
fp=fopen("ball.txt","w");
if(fp==NULL)
{
l=100;
v=10;
}
else
{
printf("pleastenterlengthandvelocity:
");
scanf("%d%d",&l,&v);
}
fprintf(fp,"%d%d",l,v);
fclose(fp);
initgr();
for(i=0;i{
p[i].x=l*cos(PI/PNUM+i*PI/(PNUM/2))+cx;
p[i].y=cy-l*sin(PI/PNUM+i*PI/(PNUM/2));
}
p[PNUM].x=p[0].x;
p[PNUM].y=p[0].y;
for(;!
kbhit();)
{
bx=p[0].x;
by=p[0].y;
for(i=0;!
kbhit()&&i{
for(j=0;!
kbhit()&&j<2*l*sin(PI/PNUM);j++)
{
for(k=0;k<1000/v;k++)
delay(30);
setcolor(BLACK);
circle(bx,by,5);
setcolor(WHITE);
for(k=0;kline(p[k].x,p[k].y,p[k+1].x,p[k+1].y);
bx=p[i].x+j*(p[i+1].x-p[i].x)/(2*l*sin(PI/PNUM));
by=p[i].y+j*(p[i+1].y-p[i].y)/(2*l*sin(PI/PNUM));
circle(bx,by,5);
}
}
}
}