交通智能 图形仿真系统C语言成设计报告.doc

上传人:laozhun 文档编号:2385131 上传时间:2023-02-17 格式:DOC 页数:128 大小:2.90MB
返回 下载 相关 举报
交通智能 图形仿真系统C语言成设计报告.doc_第1页
第1页 / 共128页
交通智能 图形仿真系统C语言成设计报告.doc_第2页
第2页 / 共128页
交通智能 图形仿真系统C语言成设计报告.doc_第3页
第3页 / 共128页
交通智能 图形仿真系统C语言成设计报告.doc_第4页
第4页 / 共128页
交通智能 图形仿真系统C语言成设计报告.doc_第5页
第5页 / 共128页
点击查看更多>>
资源描述

《交通智能 图形仿真系统C语言成设计报告.doc》由会员分享,可在线阅读,更多相关《交通智能 图形仿真系统C语言成设计报告.doc(128页珍藏版)》请在三一办公上搜索。

1、C语言课程设计报告交通智能图形仿真系统题目:交通智能图形仿真系统班级:自动化1201班组员:程朝阳学号:U201214459杜珂学号:U201214475指导教师:周纯杰老师上交日期:2013.11.2目 录1 引言31.1智能交通的背景31.2编写目的31.3任务概述42 需求分析42.1需求分析42.2运行环境53 系统设计63.1功能需求描述63.2程序流程图63.3功能和操作简介(界面)63.4程序模块划分123.5程序中的名词定义及注释164算法分析204.1核心算法分析204.2其他函数算法分析245程序总结385.1编程过程中的疑难点处理385.2程序不足之处416 组员分工42

2、7参考资料428 具体函数解释及原代码42 一. 引言 1.1背景智能交通系统(IntelligentTransportationSystem,简称ITS)是未来交通系统的发展方向,它是将先进的信息技术、数据通讯传输技术、电子传感技术、控制技术及计算机技术等有效地集成运用于整个地面交通管理系统而建立的一种在大范围内、全方位发挥作用的,实时、准确、高效的综合交通运输管理系统。ITS可以有效地利用现有交通设施、减少交通负荷和环境污染、保证交通安全、提高运输效率,因而,日益受到各国的重视。21世纪将是公路交通智能化的世纪,人们将要采用的智能交通系统,是一种先进的一体化交通综合管理系统。在该系统中,车

3、辆靠自己的智能在道路上自由行驶,公路靠自身的智能将交通流量调整至最佳状态,借助于这个系统,管理人员对道路、车辆的行踪将掌握得一清二楚。 1.2编写目的 通过对十字路口智能交通和交通规则的过程分析,建立模拟十字路口交通仿真的图形界面操作系统,对其红绿灯、车辆运行、车辆减速等多个方面的功能模拟,实现模拟真实的十字路口交通仿真的流程。此次C语言课程设计是本专业的第一次课程设计,具有重要的意义:通过上个学期对C语言的学习,对C语言编程有了初步的了解,获得了一定的基础但是非常缺乏实际的编程经验,无法从质上对自己的编程技巧有一个很大的提高,这次的课程设计给我们提供了一个非常好的锻炼机会。通过二个人的分工合

4、作,在实际中运用和训练程序设计的模块化和工程化思想和技术,努力掌握C语言精髓;同时提高自己的交流与团队合作的能力.为以后的更专业更复杂的课程设计和实践活动打好基础。1.3任务概述 实现十字路口的交通运行的全过程模拟,设置东西南北四条路及东西南北四条路所对应的路灯,系统控制路灯亮色情况,并且使车辆在路灯的控制下有序进行交通模拟。如果车辆都驶出界面,仿真模拟结束。程序具备以下功能:车辆数目随机产生:由系统随机产生四个方向行驶车辆的数目车辆数目人工添加:人工输入四个方向行驶车辆的数目路面交通智能化:根据交通规则,合理安排路灯情况,使车辆行驶效率最优化 控制自动化:根据路面情况和路灯情况判断车辆的行驶

5、情况统计功能:统计一次仿真的数据,并进行分析 要求以十字路口为对象,图形化模拟马路、路灯、车辆的一体化交通流程;能对路面情况的进行设计、控制、优化和统计等功能。 二.需求分析2.1需求分析智能交通系统具有以下两个特点:一是着眼于交通信息的广泛应用与服务,二是着眼于提高既有交通设施的运行效率。与一般技术系统相比。智能交通系统建设过程中的整体性要求更加严格这种整体性体现在:(1) 跨行业特点。智能交通系统建设涉及众多行业领域,是社会广泛参与的复杂巨型系统工程,从而造成复杂的行业间协调问题。(2)技术领域特点。智能交通系统综合了交通工程、信息工程,通信技术、控制工程、计算机技术等众多科学领域的成果,

6、需要众多领域的技术人员共同协作。(3)政府、企业、科研单位及高等院校共同参与,恰当的角色定位和任务分担是系统有效展开的重要前提条件。(4)智能交通系统将主要由移动通信、宽带网、RFID、传感器、云计算等新一代信息技术作支撑,更符合人的应用需求,可信任程度提高并变得“无处不在”。 我们用TC3.0编写的C语言程序来模拟自动售货机的控制及各种操作过程。2.2运行环境(DOS环境)该系统给予tc2.0和bc31开发,适用于dos3.0以上的所有dos版本和windows操作系统;本软件设计中加入了鼠标和键盘操作,因此操作过程必须依赖鼠标和键盘才能实现所有功能;本软件对于显示卡无特殊要求;本软件可以允

7、许用户自定义一些参数,具有良好的人机交互性。本软件主要的输入方式是动画模拟,通过分页动画实现小车的步进,通过函数判断控制小车步进方式。实际操作中需要输出信息将采用菜单的模式传递给用户。除此之外无其他特殊要求;出现图形无法显示或图形显示效果差处理办法:检查显示卡驱动是否正常;出现某些子程序的初始化无法正常完成处理办法:显示初始化失败的位置,并退出程序;出现空间分配失败处理办法:显示为内存不够,退出程序并检查内存利用情况;三. 系统设计3.1 功能需求描述进入主界面,可以选择所需的系统信息和仿真入口,并进行点击。进入车辆数目设置界面,选择车辆数目生成方式:随机生成或自定义。若选择随机生成,则由系统

8、随机产生东西南北四个路口车辆的数目,若选择自定义,则由用户从输入框输入车辆数目进行定义。进入仿真界面,则由键盘控制仿真界面的开始与暂停,仿真从进入仿真界面第一次按下空格键开始,到车辆全部驶出屏幕结束。3.2程序流程图(见附录)3.3功能和操作简介(界面)菜单界面1点击“操作介绍”出现仿真操作说明,点击“关于我们”出现编写者姓名、学号,点击“进入模拟”进入菜单界面2,进行路口车辆输入。进入菜单界面2-设置各个路口车辆数目:点击“随机设定”由系统自动生成四个020路口的数目,点击“自定义”将由用户手动输入路口车辆数目,点击“开始模拟”进入仿真界面随机产生路口车辆数目单击路口名称可输入该路口车辆数目

9、输入规则:必须输入020之间的整数,否则程序将跳出菜单界面设计图纸进入仿真界面开始车辆仿真,按任意键退出仿真界面设计图纸3.4 程序模块划分在程序模块的分析中,为了方便理清函数之间的调用关系,我们采用了函数级别的定义方式。自顶向下级次增高,在某些模块中被多次调用的小功能函数定义为该模块的工具函数。故main函数被定义为一级函数,在main函数中被直接调用的子函数定义为二级函数,依此类推主函数模块:#includemain.hvoid main() int gd=VGA,gm=VGAHI; initgraph(&gd,&gm,c:tc30bgi); cleardevice(); readbmpw

10、el(); /读取欢迎图片 cleardevice(); closegraph(); initgraph(&gd,&gm,c:tc30bgi); menu(); /执行菜单函数 getch(); closegraph();主函数main()中除了调用welcome ()函数显示欢迎画面和menu()函数进入菜单界面;主要子函数是调用的fzxt()函数,,menu()函数即菜单选择模块的根函数。下面分别来介绍这个主要模块。一、图形模块:主要是仿真界面:马路、路灯和车辆二、鼠标模块:包括鼠标的图形,鼠标状态。三、汉字模块:中文显示四、菜单模块: 1:菜单界面a: 查看仿真操作说明 查看程序编写人员

11、详情 进入仿真设置 2.菜单界面b: 设置东西南北各个路口的车辆数目 文字框输入 五、 交通仿真模块: 车辆控制、车辆警报检测、车辆动画 路灯控制、路灯动画图形模块此模块用于路面、交通灯及车辆的绘制。本模块的核心函数:void draw();本模块的三级函数:(被void fzxt()调用)Void draw_avenue() 画路面的函数 Void draw_car() 画车辆的函数Void draw_lamp() 画路灯的函数鼠标汉字模块void shubiao() 对鼠标初始化void cursor(int a,int b) 在(a,b)点画鼠标int read(int *x,int*y

12、 ,int*buttons)调用中断来读鼠标的状态如果鼠标不动,这一直在里面循环,直到鼠标状态改变或是按键,就退出循环void neyxy(int *x,int*y ,int*buttons) 鼠标移动的函数,通过read的返回值在异或的模式下,覆盖原来的鼠标和画新的鼠标。Outtextxy(int,int ,char *,int) 汉字输出交通系统仿真模块(核心)车辆控制模块Void initialize_car(struct CAR *p,int n) 车辆初始化(坐标、角度、方向)void judge_alarm_line(struct CAR *p) 车辆警戒线判断函数void jud

13、ge_alarm_car(struct CAR *p,int a1,int a2,int a3,int a4) 车辆周围警报判断函数void judge_alarm_lamp(struct CAR *p,struct LAMP *pl) 车辆对应路灯情况判断void control_car(struct CAR *p,struct LAMP *pl,int a1,int a2,int a3,int a4) 控制小车步进的函数void control_speed(struct CAR *p) 控制小车速度的函数void step1(struct CAR *p) 车辆在警戒线前的步进情况void

14、step2(struct CAR *p ) 车辆在警戒线后的步进情况路灯控制模块void initialize_lamp(struct LAMP *pl) 路灯初始化(坐标、颜色)void control_lamp(struct LAMP *pl,int g,int *flag) 路灯颜色控制 菜单模块void menu(); /画菜单1的函数 void menu_one_choose(FRAME *); /鼠标操作菜单1的函数int mouseon(FRAME *); /判断鼠标是否在文字的杉树void bklight(FRAME *,MOUSESTATE *); /出现鼠标在文字框上的效果

15、void draw_frameb1(FRAME ); /大文字框void draw_frameb2(FRAME ); /小文字框void howtowork(); /出现操作介绍文字框的函数void aboutus(); /出现关于我们文字框的函数void simenu(MOUSESTATE *); /画菜单界面2的函数void menu_two_choose(FRAME *,FRAME *,MOUSESTATE *); /鼠标操作菜单界面2、键盘输入的函数void car_num_random(FRAME *p); /键入各个路口车辆数目的函数int strtoint(char *); 辅助

16、模块3.5 程序中的名词定义及注释1.对文件名(*.cpp)的解释CAR.C主函数DRAW.C用于画界面DRAWFRAME.C鼠标高亮FZXT.C读取系统时间 hanzi.C用于中文汉字输出INPUT.C附有管输入功能 LAMP.C对物品的文件操作MAIN.C进入管理员界面的menu选择MENU.C进入系统的menu选择MOUSE.C对鼠标操作READBMP1.C读图SIMULA1.C仿真模拟2.程序中的结构定义:交通灯结构struct LAMP int x; /灯框当前x坐标 int y; /灯框当前y坐标 int lc; /左灯的颜色 int sc; /中间灯的颜色 int rc; /右灯

17、的颜色int dirt; /灯所在的路的方向 int flag; /灯的顺序号;车辆结构struct CARint x; /车子中心当前x坐标int y; /车子中心当前y坐标int color; /车子颜色 int alarm_car; /警戒距离警报int alarm_line; /警戒线警报int alarm_lamp; /红灯警报int dirt; /车子所在的初始路向int street; /车子转向的路向int speed; /车子当前速度int justment; /首位为所在路,次位为所在道int flag; /用于标志车子是否驶出桌面*/double angle; /车子当前

18、的角度,正北为零度,逆时针;文字框结构struct _frame int x1; 左上点横坐标 int y1; 左上点纵坐标 int x2; 右下点横坐标 int y2; 右下点纵坐标 int dx; 文字起始横坐标校准值 int dy;文字起始纵坐标校准值 char frname20;文字框内的文字FRAME;鼠标结构typedef struct _mouse int mousex; 鼠标所在位置横坐标 int mousey; 鼠标所在位置纵坐标 int buttons; 鼠标点击状态MOUSESTATE;3. 各个头文件包含函数1.CAR.H: void initialize_car(st

19、ruct CAR *p,int n);void step2(struct CAR *p );void step1(struct CAR *p);void control_car(struct CAR *p,struct LAMP *pl,int a1,int a2,int a3,int a4);void judge_alarm_line(struct CAR *p);void judge_flag(struct CAR *p);void judge_alarm_car(struct CAR *p,int a1,int a2,int a3,int a4);void control_speed(s

20、truct CAR *p); 2. DRAW.H:void draw_avenue();void draw_car(struct CAR *p);void draw_lamp(struct LAMP *pl);3. DRAWFRAME.H:void draw_frameb1(FRAME );void draw_frameb2(FRAME );4. FZXT.H:void fzxt(int ,int ,int ,int );5. hanzi.C:void outhzxy(int x,int y,char *str,int color); void outbighzxy(int x,int y,c

21、har *str,int color);6. INPUT.H:int input(FRAME *p,char *s);7. LAMP.H:void initialize_lamp(struct LAMP *pl);void judge_alarm_lamp(struct CAR *p,struct LAMP *pl);void control_lamp(struct LAMP *pl,int g,int *flag);void lighten_lamp(struct LAMP *pl,int k,int color) ;8. MENU.H:void menu();void menu_one_c

22、hoose(FRAME *);int mouseon(FRAME *);void bklight(FRAME *,MOUSESTATE *);void draw_frameb1(FRAME );void draw_frameb2(FRAME );void howtowork();void aboutus();9. MOUSE.H:int init(int xmi,int xma,int ymi,int yma);int read(int *mx,int *my,int *mbutt);void cursor(int a,int b);void curstoxy(MOUSESTATE *ps);

23、void newxy(int *mx,int *my,int *mbutt);void shubiao();10. READBMP1.H:void selectpage(register char page); unsigned char set_SVGA_mode(int vmode); unsigned int get_SVGA_mode(); void readbmp(char *p); void readbmpwel(); void readbmpend();11. SIMULA1.H:void simenu(MOUSESTATE *);void menu_two_choose(FRA

24、ME *,FRAME *,MOUSESTATE *);void car_num_random(FRAME *p);int strtoint(char *);12. 四算法分析4.1 核心算法(fzxt)的分析 void fzxt(int a1,int a2,int a3,int a4) int gd=EGA,gm=EGAHI; int i=0,n=a1+a2+a3+a4,m=0; int tg4=0,0,0,0; int b,b1; struct CAR p50; /设置车辆数组 struct LAMP pl4; /交通灯数组 randomize(); initgraph(&gd,&gm,c:

25、tc30bgi); draw_avenue(); /先画马路,在马路的基础上进行分页动画 for(i=0;ia1;i+) /车辆位置初始设定,因为不能让车都从一个点出发,所以每个车辆起始点离警戒线远一点 pi.dirt=1; pi.y=SOUTHY0+CARDIS*i; for(i=a1;i(a1+a2);i+) pi.dirt=2;pi.x=EASTX0+CARDIS*(i-a1); for(i=(a1+a2);i(a1+a2+a3);i+) pi.dirt=3;pi.y=NORTHY0-CARDIS*(i-a1-a2); for(i=(a1+a2+a3);i(a1+a2+a3+a4);i+

26、) pi.dirt=4; pi.x=WESTX0-CARDIS*(i-a1-a2-a3); for(i=0;ia1+a2+a3+a4;i+) b1=random(1001); b=(b1%3)+1; 随机产生车辆转弯的方向 pi.street=b; initialize_car(&pi,n); for(m=0;m4;m+) plm.dirt=m+1; 对交通灯进行初始化 initialize_lamp(&plm); initgraph(&gd,&gm,c:tc30bgi); cleardevice(); while(!kbhit() 开始分页动画模拟 setactivepage(0);/画第0

27、页图 cleardevice();draw_avenue();for(i=0;in;i+)control_car(&pi,&pl(pi.dirt-1) ,a1,a2,a3,a4); 控制小车步进情况,画出小车draw_car(&pi); for(m=0;m4;m+) control_lamp(&pl0,tg,&pi.flag); draw_lamp(&plm); 控制交通灯闪动颜色 setvisualpage(0);setactivepage(1);/画第1页图cleardevice();draw_avenue();for(i=0;in;i+) control_car(&pi,&pl(pi.d

28、irt-1),a1,a2,a3,a4); draw_car(&pi);for(m=0;mflag=1) initialize_car(&pi,n); getch(); closegraph(); 车辆的控制主要由3个警报参数决定:警戒线警报、交通灯警报和周围车辆警报。 这3个警报共同控制了车辆的步进方式和速度,也就由此全面控制车辆。 先由车辆扫描路况,开始给出3个警报,根据警戒线警报和交通灯警报决定车辆的步进方式,解决了车辆遇到红灯黄灯停下不走的问题;根据车辆的所在道路和周围车辆警报控制车辆速度,解决了前面一辆车因为红灯停下而被后面车辆压过的问题。五程序总结 5.1 编程中的疑难点分析 1.鼠

29、标问题 由于这个程序的菜单要采用鼠标操作,在我一开始,我想借鉴书上的鼠标操作函数,可是发现,如果不懂其中的原理,会在画完图,尤其是调用完putimage()函数后,会有鼠标印的留下。但是,后来研究鼠标,发现其用的是异或的原理,这个是指能够在原来的的地方把鼠标覆盖掉,所以每次我都会改写setwritemode()为异或的形式。 2.内存分配释放问题 因为这个程序是一个对图形界面操作的函数,自然要对图形大量的操作,我们知道,在我们用到getimage()时,我们都会用到指针指向malloc开辟的一处连续的内存,可是,我们经常会发现如果图形比较大,那么malloc开辟不了那么大的内存,就会自动退出来

30、,所以我们只能在开辟小的图形窗口下,对图形的操作,但是如果需要大的图形窗口,我们也只能在原来的图上操作完后,用单调的背景来覆盖。比如分配buff=malloc(imagesize(375,85,625,450); if(buff=NULL) printf(not enough memory); exit(0); 分配这么大的就会退出来后来我们直接用setfillstyle(1,0);bar(375,85,625,450);完成了图形的覆盖可是,在后续的编写中,当我们添加了对文件的操作时,程序又自动退出来,我以为是有分配不了内存了,我就一直纠结在,图形内存的分配上。不过,突然灵感来了,我想肯定是

31、之前有内存没有释放,可是我检查了每次分配内存我都释放了。于是我,就在用printf()一个个找,后来发现居然是文件分配不到内存,因为我在调用文件操作的函数时,我已经对图形分配了内存,而且没有释放它,而是在调用文件后才释放。后来我将对文件操作的函数malloc的前面,这样就解决了内存分配的问题。5.2 程序不足之处1.鼠标的颜色会因为背景的颜色改变而改变2.对动画部分没有调好,仿真界面闪动较厉害3.界面的美化不行,高亮有bug存在4.提示功能、键盘功能、返回功能等都没有加上六组员分工6.1 组员分工 程朝阳 所有代码 2318行李乐 无 0行七参考资料王士元. C高级实用程序设计. 北京: 清华

32、大学出版社. 1996周纯杰,刘正林等. 标准C语言程序及应用. 武汉: 华中科技大学出版社. 2005谭浩强. C语言程序设计. 北京: 清华大学出版社, 2000陈超 C语言常用函数速查手册. 北京: 化学工业出版社 2010八 函数具体解释及原代码/*主函数main.c*/#includemain.hvoid main() int gd=VGA,gm=VGAHI; initgraph(&gd,&gm,c:tc30bgi); cleardevice(); readbmpwel(); cleardevice(); closegraph(); initgraph(&gd,&gm,c:tc30b

33、gi); menu(); getch(); closegraph();/*菜单函数menu.c*/#includemenu.hvoid menu() FRAME ml3; FRAME frame_jrmn=265,213,256+FRAME_XB,213+FRAME_YB,265+FRAME_DXB,213+FRAME_DYB,进入模拟; FRAME frame_czjs=265,273,256+FRAME_XB,273+FRAME_YB,265+FRAME_DXB,273+FRAME_DYB,操作介绍; FRAME frame_gywm=265,333,256+FRAME_XB,333+FR

34、AME_YB,265+FRAME_DXB,333+FRAME_DYB,关于我们; cleardevice(); setbkcolor(8); outbighzxy(40,40,智,9); outbighzxy(110,40,能,9); outbighzxy(180,40,交,9); outbighzxy(250,40,通,9); outbighzxy(320,40,仿,9); outbighzxy(390,40,真,9); outbighzxy(460,40,系,9); outbighzxy(530,40,统,9); draw_frameb1(frame_jrmn); draw_frameb1

35、(frame_czjs); draw_frameb1(frame_gywm); ml0=frame_jrmn; ml1=frame_czjs; ml2=frame_gywm; menu_one_choose(&ml0); getch(); closegraph(); readbmpend(); exit(1);void menu_one_choose(FRAME *pm) MOUSESTATE *pmouse; int keyz; int i;/ shubiao(); pmouse-mousex=0,pmouse-mousey=0,pmouse-buttons=0; shubiao(); cu

36、rstoxy(pmouse); cursor(pmouse-mousex,pmouse-mousey); while(1) newxy(&pmouse-mousex,&pmouse-mousey,&pmouse-buttons);if(pmouse-buttons=1) if(mouseon(pm) cleardevice();printf(tttt);simenu(pmouse);pmouse-buttons=0; /模拟函数closegraph();exit(1); else if(mouseon(pm+1) howtowork(); /操作函数pmouse-buttons=0;delay

37、(100); else if(mouseon(pm+2) aboutus(); /关于我们 pmouse-buttons=0; delay(100); else if(mouseon(pm) cursor(pmouse-mousex,pmouse-mousey); bklight(pm,pmouse); else if(mouseon(pm+1) cursor(pmouse-mousex,pmouse-mousey);bklight(pm+1,pmouse); else if(mouseon(pm+2) cursor(pmouse-mousex,pmouse-mousey); bklight(pm+2,pmouse); /* else if(mouseon(pm+3) bklight(pm+3,pmouse); */ int mouseon(FRAME *pm)int dx,dy,buttons;read(&dx,&dy,&buttons);if( dxpm-x1 & dxx2 & dyy2 & dypm-y1) return 1;e

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号