1、使用C语言计算与模拟足球射门使用C语言计算与模拟足球射门【4】1 引言C语言是近年来在国内外得到迅速推广应用的一种计算机语言。C语言功能丰富、使用灵活方便、应用面广、目标程序效率高、可移植性好,既有高级语言的优点,又有低级语言的许多特点。【1】Turbo C是在微机上广泛使用的编译程序。它具有方便、直观、易用的界面和丰富的库函数。它向用户提供一个集成环境,把程序的编辑、编译、连接和运行等操作全部集中在一个界面上进行,使用十分方便。采用C语言编写的程序易懂,较为直观,对硬件要求比较低【1】。计算机模拟是在计算机上通过系统模型模拟一个实际存在或正在设计中的真实系统,以再现(实现可视化)或分析(数值
2、计算)真实系统的本质特征,并以证明实际问题的可信性。【6】【7】动画可突出并强化要表达的事物特征,生动形象的模拟事物的运动等。用C语言提供的各种实现方法来制作动画都各有其优点,本文利用改变图像坐标的方法来模拟足球射门。使用该方法编写的源程序比较通俗易懂。2 C语言制图与计算机动画技术2.1 C语言制图简介Turbo C中有丰富的图形函数,它支持CGA,EGA,UGA等多种显卡及多种图形显示模式,提供了画点、线、圆、椭圆、多边形等绘图功能,还提供了颜色控制、图形填充和线条模式等功能。可以利用C语言提供的许多图形函数来方便、快速的实现动画,且动画效果另人满意。在Turbo C语言中实现动画的方法有
3、很多种,如目标移动方法、显示页和编辑页交替变化方法、画面存储和再重放方法等等【2】。目标移动方法是利用C语言提供的多种画图函数将图形画好以后,在时间上取间隔非常小的时间段来不断改变图象的在屏幕上的坐标以达动画效果。显示页和编辑页交替变化方法是将当前显示页和编辑页分开,在编辑页上画好图形后,立即令该页变为显示页显示。然后再上次的显示页上(现在变为编辑页)进行画图,画好后又再次进行交换。如此编辑页和显示页反复交换,在观察者的视觉中,就出现了动画的效果。画面存储和再重放方法如同制作幻灯片一样,将整个动画过程变成一个个片段,然后存储到显示缓冲区,当把它们按顺序重放到屏幕上时,就出现了动画效果。【2】2
4、.2 计算机动画技术计算机动画是借助计算机生成一系列动态演示的图形、图像的技术。动画的实现过程是:首先在屏幕的当前未知画对象并保持一定的时间;接着从屏幕的当前未知删除对象;然后在屏幕上新位置上画对象,这样就产生了动画效果【2】。由于动画具有直观,形象,生动等特点,故采用动画技术,可突出并强化要表达的事物特征,生动形象的模拟事物的运动等。随着计算机动画技术的迅速发展,它的应用领域日益扩大,制作计算机动画使用的工具也日益繁多。比如:Flash,3D Studio,3DMAX等。3 使用C语言描述抛体运动3.1抛物运动抛体运动是发生在竖直平面内的二维空间的运动。在抛体运动中,被抛物体主要受重力和空气
5、摩擦力影响,在这里,忽略空气的影响,假设物体以初速度SPEED沿与水平方向成0角的方向被抛出。程序中,初速度用SPEED表示,角度用Angle表示,足球射出点与球门的距离用LONGS表示,球门高度用H表示。3.2 动画原理 在利用Turbo C来编写图形代码时,要能够准确的确定图形在显示器上的坐标。显示器的屏幕如同一张坐标纸,可用x,y坐标值表示图形上任一点的位置。显示屏的坐标从左上角(0,0)开始,正x轴向右延伸,正y轴想下延伸,为一个倒置的直角坐标系。x和y均为大与0的数值,其最大值由显示器的类型和模式决定。【2】 利用人的视觉暂留这一生理特点(即对动态的图象变化,仅能分辨出时间间隔为25
6、毫秒左右的变化,若太快,则不能分辨出来)。将一个图象分解成不同时间出现的图象,然后一张张快速的呈现在屏幕上。从视觉效果上看,就如同这些画面在连续的改变,因而给人以动的视觉效果。【2】本设计中,在利用画图函数(fillpoly(int numpoints,int far * polypoints))画出所需要的组合图形以后,以足够小的时间间隔(本设计中取0.0005S为单位)来刷新和改变图象位置。由于刷新的速率比人视觉能分辨的要小,呈现在屏幕上的也就成了动的视觉效果。4 源程序解析4.1 头文件#include stdio.h#include math.h#include conio.h#inc
7、lude stdlib.h#include graphics.h#include alloc.h stdio.h中标准文件输出,是专门用与DOS的标准输出设备(一般为显示器的),在调用参数中不需要再指定文件名,它们的输出可以在运行时重定向到一个普通的文件上去。【2】 math.h文件库包含了所有关于数学计算的公式(如pow函数、三角函数、cos函数、sin函数等等)、内部变量的定义和各函数返回值及其参数类型的定义。 对文本的屏幕输出函数都包含在conio.h头文件中。【3】 Turbo C提供的系统函数都包含在头文件graphics.h中,它说明了制图函数的原形及其参数、功能等。4.2编译预处
8、理定义了在程序中常用到且易于改变的常量,这样使程序显得明快易懂,且不会因为修改遗漏而出现程序出错。#define SPEED 20.00#define LONGS 25.00#define HIGHT 3.44#define G 9.80#define PI 3.1415926#define CONSBL 40.00/3.44 /*实际图形与模拟图形的大小比例*/SPEED表示足球被射出时的初试速度,LONGS表示射球点到球门的距离,HIGHT表示球门的高度。4.3 图形系统初始化 编制图形程序时,首先要在程序中对使用的图形系统初始化,对屏幕颜色进行设置和清屏等。【2】 图形系统的初始化是指确
9、定要使用什么类型的图形显示适配器驱动程序,采用什么模式的图形方式(也就是相应程序的入口地址),以及该适配器驱动程序的路径名。所使用系统的显示适配器一定要支持所选用的显示模式,否则将会出错。【2】void Init() int graphmode; /*图形设备驱动*/ int graphdriver; /*图形模式值*/ int Errorcode; /*出错代码*/ graphdriver=DETECT; /*自动检测显示设备类型*/ initgraph(&graphdriver,&graphmode,C:tc20); Errorcode=graphresult(); /*读取初始化的结果*
10、/ /*如果在初始化过程中出现错误*/ if(Errorcode!=grOk) printf(Graphics System Error:%sn,grapherrormsg(Errorcode); exit(1); cleardevice();参数graphmode用表(1)所示的模式号或标号符定义。参数graphdriver是一个显示器驱动程序的枚举变量,它属于下面所示的枚举类型:emun graphics_driverDETECT,CGA,MCGA,EGA,EGA64,EGAMONO,IBM8514,HERCMONO,ATT400,VGA,PC3270 ;2其中驱动程序目录路径为空字符“”
11、时,表示就在当前目录下,否则为Turbo C软件所在的目录路径。【2】 上面初始化过程中,由DETECT检测所用适配器的类型,将当前目录下相应的驱动程序装入,并采用最高分辨率显示模式作为graphmode的值。【2】4.4 double GetAngle()函数double GetAngle() double Angle; printf(n n Please input the Angle of text:Angle(0.0090.00)=); scanf(%lf,&Angle); while(1) if(Angle=90.00) printf(Sorry,The Angle of text
12、is error!Please input again!Angle(0.0090.00)=); scanf(%lf,&Angle); else return Angle; break; 在运行程序时屏幕会出现字符串提示,当键盘有输入以后并对从键盘接收的角度(Angle)进行判断。如果角度不在需要测试的范围内将在出现提示并再需要重新输入角度,直到测试角度在测试范围以内。4.5 void Text()函数调用函数GetAngle()获得一个所需要测试的角度以后就可以进行模拟。void Text() double i,j; double t; double x,y; double x1,y1,hud
13、u; hudu=GetAngle()*PI/180.00; x1=cos(hudu); y1=LONGS/SPEED; t=y1/x1; for(i=0;i=t;i=i+0.001) cleardevice(); MakeGraph(); x=SPEED*i*cos(hudu); y=SPEED*i*sin(hudu)-1.00/2.00*G*i*i; setfillstyle(1,15); circle(450-(int)(x*CONSBL),(int)300-(y*CONSBL),5); for(j=0;j=500000;j+); setfillstyle函数的原型为:void far s
14、etfillstyle (int pattern,int color)【3】。函数的功能是为下面需要画出的图形设置填充模式和填充颜色。pattern指定要设置的填充模式,color指定要设置的填充颜色。【2】4.6 MakeGraph()函数MakeGraph()函数中调用fillpoly()函数来画出多边行,在多次的调用后得到了现实中的球门。该函数的实现代码如下:void MakeGraph() setbkcolor(BLUE); /*设置背景颜色*/ setcolor(RED); /*设置绘画颜色*/ setlinestyle(0,0,1); /*线型为实线,线宽为3个像素*/ line(
15、70,250,125,165); line(125,165,125,125); line(125,125,70,210); line(70,210,70,250); setlinestyle(0,0,1); line(10,250,70,250); line(10,250,60,210); line(60,210,70,210); line(70,250,70,210); line(60,210,115,125); line(115,125,125,125); setlinestyle(3,0,1); /*线型为点画线,线宽为一个像素*/ line(10,250,65,165); line(6
16、5,165,125,165); line(65,165,115,125); setbkcolor函数的原型为:void far setbkcolor(int color)。该函数的功能是设置背景颜色,其color指定要设置的颜色值。【3】setcolor函数的原型为:void far setcolor(int color)。函数的功能是设置当前的绘图颜色,其color指定要设置的颜色值。【3】setlinestyle函数的原型为:void far setlinestyle (int linestyle, int upattern, int thickness)。该函数的功能是设置当前线条的类型
17、、宽度或填充模式。参数linestyle说明以何种线型来绘画以后的线条(如用实线、点线、中心线或者破折线),不影响画圆、圆弧、椭圆和扇形。参数thickness指定以后画出的线条的粗细。参数upattern:只有当linestyle是USERBIT_LINE(4)时才起作用,在这种情况下,只要模式字里有一个为是1,则线中的对应点像素点就用当前颜色点绘画出来。如果参数linestyle不是USERBIT_LINE(4),则参upattern仍要给出,只是被忽略而不起作用。【3】5程序运行结果该程序在Turbo C环境下运行,首先在屏幕上出现一个提示字符串,如图(一)所示。如果所输入的角度不在测试
18、范围以后,将再出现字符串提示,如图(二)所示。当输入角度在测试范围以后的时候,在蓝色背景下将出现在未射球时的原始图象,如图(三)所示。在敲击任意键以后,程序将进入到对所测试角度的模拟,其运动图象如图(四)、(五)、(六)所示。6结语在本程序设计中,通过Turbo C提供的各种图形函数的使用,实现了对足球射门的模拟。在模拟的过程中,忽略了空气阻力和足球本身重力的影响。这就造成了理论模拟轨迹与实际运动轨迹产生一定的误差,但并不会对模拟的可信性有很大影响。在实际中,足球在被射出以后的轨迹由于空气阻力和自身重力的影响,并不能达到理论中远度和高度。C语言中还提供了目标移动、背景移动、活动页面等方法实现动
19、画效果,无论何种方法都是对C语言中函数的灵活运用。本文只对固定距离和固定初速度的正射门作研究,在改变三者中的任何一个或者两个条件都可以再进行研究。在进行动画演示的过程中,屏幕出现一定的抖动,这对动画的效果产生了一定的影响,是本设计的一个不足之处。参考文献【1】 谭浩强,C语言程序设计(第二版)M,清华大学出版社,1999年12月第二版.【2】 王为青、刘变红, C语言高级编程及实例剖析,人民邮电出版社,2007年3月第一版,98-184【3】 郭立山、张曜、吴天,C语言函数实用手册,冶金工业出版社,2003年10 月出版,26-27,212-246,252【4】赵丽萍、王婕.物理学学习指南与思
20、考题、习题全解,机械工业出版社,2007.3【5】谭明金、俞海英.C语言程序设计实例精粹,电子工业出版社,2007.1【6】【7】致 谢在此首先向我的指导老师黄文卿副教授表示感谢。从论文的选题、初稿的完成到修改、定稿,他给了我诚恳的指导。在修改源程序的过程中,我遇到了很多的问题,黄老师都给我耐心的讲解和帮助,在此,也让我学到了很多的东西,包括一些书本知识和很多为人的道理。另外,在论文的写作过程中,对参考文献的所有作者表示衷心的感谢。附录1:表(1) Turbo C支持的适配器和图形模式【2】适配器Driver模式Mode分辨率(象素)颜色数页数标记符CGA01234320*200320*200
21、320*200320*200640*200444421111CGAC0CGAC1CGAC2CGAC3CGAC4EGA01640*200640*350161642EGALOEGAHIEGA6401640*200640*35016441EGA64LOEGA64HIEGAMONO0640*35021EGAMONOHIVGA012640*200640*350640*480161616221VGALOVGAMEDVGAHIMCGA012345320*200320*200320*200320*200640*200640*48044442211111MCGA0MCGA1MCGA2MCGA3MCGAMEDMC
22、GAHIHERC0720*34821HERCMONOHIATT400012345320*200320*200320*200320*200640*200640*400444422111111ATT400C0ATT400C1ATT400C2ATT400C3ATT400MEDATT400HIPC32700720*35021PC3270HIIBM851401640*4801024*768256256IBM8514LOIBM8514HI附录2:本文源程序:#include stdio.h#include math.h#include conio.h#include stdlib.h#include gr
23、aphics.h#include alloc.h #define SPEED 20.00#define LONGS 25.00#define HIGHT 3.44#define G 9.80#define PI 3.1415926#define CONSBL 40.00/3.44 /*实际图形与模拟图形的大小比例*/*初始化图形系统*/void Init() int graphmode; /*图形设备驱动*/ int graphdriver; /*图形模式值*/ int Errorcode; /*出错代码*/ graphdriver=DETECT; /*自动检测显示设备类型*/ initgra
24、ph(&graphdriver,&graphmode,C:WINLibTC); Errorcode=graphresult(); /*读取初始化的结果*/ /*如果在初始化过程中出现错误*/ if(Errorcode!=grOk) printf(Graphics System Error:%sn,grapherrormsg(Errorcode); exit(1); cleardevice();void MakeGraph() setbkcolor(BLUE); /*设置背景颜色*/ setcolor(RED); /*设置绘画颜色*/ setlinestyle(0,0,1); /*线型为实线,线
25、宽为3个像素*/ line(70,250,125,165); line(125,165,125,125); line(125,125,70,210); line(70,210,70,250); setlinestyle(0,0,1); line(10,250,70,250); line(10,250,60,210); line(60,210,70,210); line(70,250,70,210); line(60,210,115,125); line(115,125,125,125); setlinestyle(3,0,1); /*线型为点画线,线宽为一个像素*/ line(10,250,6
26、5,165); line(65,165,125,165); line(65,165,115,125); /*对从键盘接收的角度判断*/double GetAngle() double Angle; printf(n n Please input the Angle of text(0-90):Angle=); scanf(%lf,&Angle); while(1) if(Angle=90.00) printf(Sorry,The Angle of text is error!Please input again!Angle(0.0090.00)=); scanf(%lf,&Angle); el
27、se return Angle; break; /*对从键盘接收的角度进行模拟*/void Text() double i,j,t,x,y,x1,y1,hudu; hudu=GetAngle()*PI/180.00; x1=cos(hudu); y1=LONGS/SPEED; t=y1/x1; for(i=0;i=t;i=i+0.01) cleardevice(); MakeGraph(); x=SPEED*i*(double)cos(hudu); y=SPEED*i*(double)sin(hudu)-1.00/2.00*G*i*i; setfillstyle(1,14); circle(3
28、96-(x*CONSBL),205-(y*CONSBL),8); for(j=0;j=800000;j+) ; void main() Init(); /*调用初始化函数*/ Text(); /*调用测试函数*/ 附录3:背景色值与对应的颜色名【2】颜色值颜色名颜色颜色值颜色名颜色0BLACK黑DARDGRAY8深灰1BLUE蓝LIGHTBLUE9淡蓝2GREEN绿LIGHTGREEN10淡绿3CYAN青LIGHTCYAN11淡青4RED红LIGHTRED12淡红5MAGENTA洋红LIGHTMAGENTA13淡洋红6BWOWN棕YELLOW14黄7LIGHTGRAY浅灰WHITTE15白线宽(thickness)【2】符号名值含义NORM_WIDTH1一个像素宽THICD_WIDTH33个像素宽直线的形状(linsetyle)【2】符号名值含义SOLID_LINE0实线DOTD_LINE1点线CENTER_LINE
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1