华科控制C语言课程设计交通模拟导航系统_第1页
华科控制C语言课程设计交通模拟导航系统_第2页
华科控制C语言课程设计交通模拟导航系统_第3页
华科控制C语言课程设计交通模拟导航系统_第4页
华科控制C语言课程设计交通模拟导航系统_第5页
已阅读5页,还剩98页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言课程设计报告 题目:交通模拟导航系统指导老师:周纯洁 周凯波 何顶新 彭刚 院 系: 控 制年级: 11 级小组成员: 翔羽 目 录引言31.1背景31.2参考资料3需求分析32.1需求分析32.2运行环境3系统设计33.1模块划分33.2功能简介33.3时间安排33.4程序简要流程图33.5核心算法3源代码3引言1.1背景车载GPS导航仪:随着汽车的普及和道路的建设,城际间的经济往来更加频繁,活动的区域也越来越大;为了提高生活质量,大量的休闲活动、探险活动的举行使我们并不局限在自己认识的一小块区域中,不认识道路,找不到目的地的情况也屡有发生,就此,车载GPS导航仪将会以合适的价位走入车

2、主的世界,成为车上的基本装备。车载GPS导航仪解决方案,其实是最灵活和最复杂的,车载GPS导航仪有很多种解决方案可以满足车载的需要。GPS汽车导航是将GPS和地理信息系统、现代通讯技术综合在一起,研制成的一种新型汽车导航定位设备,具备监控、调度、报警、遥控熄火和遥控断油、自动存档、系统自检等功能。它可将汽车的任何动态位置随时准确无误地显示在仪器的电子地图上。导航仪的电子地图自动跟踪显示汽车当前位置及周边情况,驾驶员可随时在导航仪上查询周边一定半径地区内的地理信息。交通模拟导航系统能够简单地模拟GPS汽车导航系统。在建立一个简单的小型化城市地图的基础上,能对该城市内指定的车辆提供导航。 1.2参

3、考资料1. 王士元. C高级实用程序设计. 北京: 清华大学出版社. 19962. 周纯杰,刘正林等. 标准C语言程序及应用. 武汉: 华中科技大学出版社. 20053. 姚远. 高级C语言程序设计技巧与实例. 北京: 机械工业出版社, 19954. 陈清华, 朱红. C语言课程设计. 南京: 东南大学出版社, 20035. 潭浩强. C语言程序设计. 北京: 清华大学出版社, 20006. 刘振安 ,苏仕华 . C语言图形设计 北京:人民邮电出版社,19957. 潘建华 ,卫跃文. C语言实用软件界面设计 西安:西安电子科大出版社,19958. 鸿健编译. c语言高级程序员编程指南 北京:北

4、京希望电脑公司公司,1991 好友指导: 彭军才 程攀 需求分析2.1需求分析由于GPS技术所具有的全天候、高精度和自动测量的特点,作为先进的测量手段和新的生产力,已经融入了国民经济建设、国防建设和社会发展的各个应用领域。随着冷战结束和全球经济的蓬勃发展,美国政府宣布2000年至2006年期间,在保证美国国家安全不受威胁的前提下,取消SA政策,GPS民用信号精度在全球范围内得到改善,利用C/A码进行单点定位的精度由100米提高到20米,这将进一步推动GPS技术的应用,提高生产力、作业效率、科学水平以及人们的生活质量,刺激GPS市场的增长。据有关专家预测,在美国,单单是汽车GPS导航系统,200

5、0年后的市场将达到30亿美元,而在我国,汽车导航的市场也将达到50亿元人民币。可见,GPS技术市场的应用前景非常可观。我们用TC3.0编写的C语言程序来模拟导航栏仪的各种操作过程。GPS导航仪的常用功能大致有:1.地图查询Ø 可以在操作终端上搜索你要去的目的地位置。Ø 可以记录你常要去的地方的位置信息,并保留下来。2.路线规划Ø GPS导航系统会根据你设定的起始点和目的地,自动规划一条线路。Ø 规划线路可以设定是否要经过某些途径点。3.自动导航 Ø 语音导航:用提前向驾驶者提供路口转向,导航系统状况等行车信息,就像一个懂路的向导告诉你如何驾车去

6、目的地一样。导航中最重要的一个功能,使你无需观看操作终端,通过语音提示就可以安全到达目的地。 Ø 画面导航:在操作终端上,会显示地图,以及车子现在的位置,行车速度,目的地的距离,规划的路线提示,路口转向提示的行车信息。 因为在DOS环境下编程模拟,所以只模拟了部分功能,如下:1. 交通模拟导航系统提供在华科校园内导航的功能;2. 进入系统后,可选择进行帮助、退出或导航;3. 选择退出,则直接退出程序。4. 选择导航,则进入导航界面:选择路径(车辆的起始点自动读取上一次所到达的目的地,选择终点,可以选择必经地),选完路线后系统将会在地图上用粗线标出路线图,选择导航开始,进入模拟导航模式

7、,用键盘控制小车的运动。过程中现实路程和时间;5. 周边查询:选择位置,就可以显示出附近的建筑;6. 帮助,则进入帮助界面,帮助如何使用导航系统;7. 直接退出;8. 系统会提前对即将经过的红绿灯进行提醒(以上为初期设计思路)2.2运行环境 交通模拟导航系统是对GPS汽车导航系统的模拟,系统的开发基于C语言, 其设计环境要求,是在DOS环境下用C语言编程实现,使用TC或BC开发软件,因此,交通模拟导航系统能够在绝大多数计算机系统上运行,包括常见的windows XP操作系统及windows 7 32位机上运行,但是由于BC在64位的windows 7下无法运行,且BC或TC在windows 7

8、下不能较好地解决全屏问题,因而,推荐在windows XP的环境下测试运行此交通模拟导航系统。系统设计3.1模块划分1. 图形界面模块:主要包括动画,主界面,菜单和地图,标出导航路线。2. 鼠标模块:包括鼠标的图形,鼠标状态。3. 汉字模块:汉字输出。4. 控制模块:控制小车运动,分为自动和手动。5. 算法模块:计算最优路径,地杰斯特拉算法。6. 文件模块:保存小车的位置路径等信息。7. 菜单模块:显示菜单8. 主界面功能实现模块3.2功能简介1. 开场动画,显示“交通模拟导航系统 欢迎使用”,附带开场动画;2. 按任意键,进入主界面,菜单栏显示“所在地”,“终点选择”,“导航开始”,“查询”

9、,“帮助”,“退出”选项;3. 点击帮助,进入文字说明界面,双击鼠标,回到主界面;4. 点击退出,则退出程序;5. 点击“查询”,列出可选地点,选择地点后则显示选择地点的信息;6. 点击“终点选择”,选择终点,确定终点选择;7. 点击导航开始,可以选择手动或者自动模式,确定模式则进入导航界面8. 进入导航界面,手动控制小车速度、方向、暂停和退出,左边菜单显示时间、速度、距离、下一站和转向等信息9. 如果是自动模式,则小车自动沿着最优路线达到终点10. 达目的地,选择继续或者退出导航。11. 回到这界面可以再次选择终点重新导航。3.3时间安排任务备注第2周系统需求分析与设计报告完成第3,4周界面

10、模块,汉字模块完成第5,6周算法模块完成第7周鼠标模块,文件模块完成第8周编码实现、调试完成第9周调试、验收、完成报告完成3.4程序简要流程图 进入开场动画 主界面 显示所在地 选择终点导航开始 查询 帮助退出 选择终点列表 单击选择终点 回到主界面 是否满足条件 选择导航模式回 主界 面查询列表选择查询地点显示地点信息 回到主界面显示帮助信息回主界 面自动 手动 键盘控制小车自动运动 到达目的地 回到主界面 N Y3.5核心算法/迪格拉斯算法void shortest_path(int beginPointNum,int finishPointNum,double distanceNN,in

11、t n,int path16)POINTSTATE stateN;/定义点的状态int i,k;double min;/最短距离for(i=0;i<n;i+)/初始化所有点的状态statei.pre=-1;/前驱都先为-1statei.len=INFINITY;statei.label=0;/0表示没有确定,1表示已经求出最短路径statebeginPointNum.len=0;statebeginPointNum.label=1;k=beginPointNum;dofor(i=0;i<n;i+)/全部点测试if(distanceki!=0&&statei.labe

12、l=0) /选出不是点k本身,且还没有确定距离的点iif(statek.len+distanceki<statei.len)/如果点i和点k相邻statei.len=statek.len+distanceki;/点i的len为点k的len加点i和点k的距离statei.pre=k;/点i的前驱为点kk=-1;min=INFINITY;for(i=0;i<n;i+)/全部检测if(statei.label=0&&statei.len<min)/选出前面改变了len,但是还没有计算最短距离的点i,k=i;/求出所有这些点的len最短的点i,i传给kmin=stat

13、ei.len;statek.label=1;/点i和点k相同,且确定k(i)点已经求出最短距离while(k!=finishPointNum);/再次以点i为点k,开始寻找,加入,扩充,直到k点为终点i=0;k=finishPointNum;dopathi+=k; /path逆序(终点到起点)存储各点,k=statek.pre;while(k>=0);pathi=-1;/为了后面方便判断,最后存储-1; 源代码/*head.h*/#include <graphics.h>#include <conio.h>#include <stdio.h>#incl

14、ude <string.h>#include <dos.h> #include <stdlib.h>#include <io.h>#include <fcntl.h>#include <time.h>#include <math.h>#include <bios.h>#include <mem.h>#define key_LEFT 0x4b00#define key_RIGHT 0x4d00#define key_DOWN 0x5000#define key_UP 0x4800#defi

15、ne key_ESC 0x011b#define key_ENTER 0x1c0d#define key_A 0x1e61#define key_S 0x1f73#define key_D 0x2064#define key_W 0x1177#define key_SPACE 0x3920#define PI 3.1415#define N 32#define INFINITY 3000#define SPEED1/pcx图片显示的定义#define SCREEN_HEIGHT 200#define SCREEN_WIDTH 320#define PALETTE_MASK 0x3c6#defi

16、ne PALETTE_REGISTER_RD 0x3c7#define PALETTE_REGISTER_WR 0x3c8#define PALETTE_DATA 0x3c9#define VGA256 0x13#define TEXT_MODE 0x03typedef struct RGB_color_typunsigned char red;unsigned char green;unsigned char blue;RGB_color,*RGB_color_ptr;/定义画地图的结构体typedef struct POINT double x;double y;int num;char

17、*notes;POINT;typedef struct BUILDING double x; double y; int dx; int num; char *name; char *notes; BUILDING;typedef struct CARdouble speed;double angle; /小车转过的角度CAR;typedef struct ROAD double x1; double y1; double x2; double y2; ROAD;typedef struct TREE /定义画树的结构体 double x;double y; double dx; double

18、 dist; int num; char fangxiang;TREE;typedef struct HOUSEdouble x;double y;int dx;int color;HOUSE;typedef struct POINTSTATEint pre;int len;int label;POINTSTATE;/chinesevoid out_hz(int x, int y,char *s,int flag,int part,int color);/mousevoid cursor(int x, int y);int initmouse(int xmi, int xma, int ymi

19、, int yma);int readmouse(int *mx, int *my,int *mbutt);void newmouse(int *mx, int*my, int*mbutt);/menuvoid menu_main();void menu_up();void menu_up_1();void auto_menu_left(double myCarSpeed,double *dist,int path16,POINT allPoint32,int *path_i,int *flagPath,int *flagOk);void menu_left(double myCarSpeed

20、,double *dist,int path16,POINT allPoint32,int *path_i,int *flagPath,int *flagOk);void help_page();void zhong_dian(int *pFinishBuilding);void zhong_dian_show();void cha_xun();void cha_xun_show();void cha_xun_information(int i );void if_start(int *flagStart,int *pFinishBuilding);void mode_select(int *

21、pflagAuto);void shan_shuo(int color,int time,int num);/mapvoid init_allPoint(POINT allPoint32);void init_buildings(BUILDING buildings15);void draw_buildings_1(BUILDING *p,double xMapSpeed,double yMapSpeed);void draw_buildings_2(BUILDING *p,double xMapSpeed,double yMapSpeed);void draw_buildings_3(BUI

22、LDING *p,double xMapSpeed,double yMapSpeed);void init_road(ROAD allRoad17);void draw_road_shuzhi(ROAD *p,double xMapSpeed,double yMapSpeed);void draw_road_shiping(ROAD *p,double xMapSpeed,double yMapSpeed);void init_tree(TREE allTree13);void draw_tree_y(TREE *p,double xMapSpeed,double yMapSpeed);voi

23、d draw_tree_x(TREE *p,double xMapSpeed,double yMapSpeed);void init_house(HOUSE houses30);void draw_house(HOUSE *p,double xMapSpeed,double yMapSpeed);void draw_car(CAR *cp);void zhuan_dong(double ang, int *body, int *win, int *head, int *rear, int *L_h_light,int *L_r_light, int *R_h_light,int *R_r_li

24、ght,int x, int y);void draw_star(int x,int y,int color,int i);void map_2();void draw_map_1(double xMapSpeed,double yMapSpeed,BUILDING buildings15,ROAD allRoad17,TREE allTree13,HOUSE houses30);/gpsvoid GPS();void init_again(int *flagStart,int *finishBuildingNum,int *flagAuto);void gps_main(int *finis

25、hBuildingNum,int flagAtuo);void mouse_select(int *flagStart, int *pFinishBuilding,int *pflagAuto);void contral_car_map(CAR *cp,int *flagExit);void auto_contral_1(int *flagExit);void auto_contral_2(CAR *cp,int path16,POINT allPoint32,int *path_i,int *flagPath,BUILDING buildings15,ROAD allRoad17,TREE

26、allTree13,HOUSE houses30);void if_zhongdian();void jisuan_dist(double distanceNN,int path16,double *dist);void if_exit(int *flagExit);void if_ok(int finishPointNum,POINT allPoint32,int *flagOk);void xy_change(POINT allPoint32,BUILDING buildings15,ROAD allRoad17,TREE allTree13,HOUSE houses30,double x

27、Map,double yMap);void xy_change_house(HOUSE *p,double xMap,double yMap);void xy_change_point(POINT *p,double xMap,double yMap);void xy_change_buildings(BUILDING *b,double xMap,double yMap);void xy_change_road_shuzhi(ROAD *p,double xMap,double yMap);void xy_change_road_shiping(ROAD *p,double xMap,dou

28、ble yMap);void xy_change_tree(TREE *t,double xMap,double yMap);void point_change_save(POINT allPoint32,double xMapSpeed,double yMapSpeed);/init_start_endvoid init_350();void init_480();void start_page();void start_cartoon();void end_page();void Set_Palette_Register(int index,RGB_color_ptr color);voi

29、d PCX_Load_Screen(char *filename,int enable_palette);void Set_Video_Mode(int mode);void pcx(char *pcx);void pcx_1(char *pcx);void picture_show_1(int x,int y,int mousekey);void picture_show_2(int i);void show_time();/recordvoid save_finish_building(int finish_building);void get_begin_building(int *p_

30、begin_building);void show_record();/dijkstravoid init_point_distance(double distanceNN,POINT allPoint32);void init_distance_1(double distanceNN);void init_distance_2(POINT point_1,POINT point_2,double distanceNN);void shortest_path(int beginPointNum,int finishPointNum,double distanceNN,int n,int pat

31、h16);void draw_shortest_path(int path16,POINT allPoint32);void draw_path(int i,int j,POINT allPoint32);/*main.cpp*/#include "Head.h"void main()init_480();start_page();/主界面menu_main();/导航界面GPS();/*init_start_end.cpp*/#include "Head.h"/640*350界面初始化void init_350()int graphdriver=VGA

32、;int graphmode=1;initgraph(&graphdriver,&graphmode,"D:BORLANDCBGI");/640*480界面初始化void init_480()int graphdriver=DETECT;int graphmode;initgraph(&graphdriver,&graphmode,"D:BORLANDCBGI");/开场模块void start_page() start_cartoon(); /pcx_1("D:BORLANDCBpcx1.pcx");

33、 / delay(4000); /开场动画void start_cartoon()int x1,y1;int j=2;int r=0;double i;out_hz(240,80,"欢迎进入",3,50,YELLOW);out_hz(100,180,"交通模拟导航系统",3,60,YELLOW);out_hz(170,280,"自动化六班",1,30,YELLOW);out_hz(330,280,"彭军才",1,30,YELLOW);out_hz(430,280,"程攀",1,30,YELLOW

34、);out_hz(270,340,"请按任意键进入",1,30,YELLOW);/显示动画while(1) for(i=0;i<310;i=i+1,r+) if(bioskey(1)break; x1=(int)r*cos(i); y1=(int)r*sin(i); putpixel(320+x1,240+y1,j); putpixel(320+x1+1,240+y1,j); delay(7); if(j=14) j=1; j+; for(i=309;i>=0;i-,r-) if(bioskey(1)break; x1=(int)r*cos(i); y1=(in

35、t)r*sin(i); putpixel(320+x1,240+y1,j); putpixel(320+x1+1,240+y1,j); delay(2); if(j=14) j=1; j+; if(bioskey(1)break; getch();/结束动画void end_page()int i;int r=220;int x,y;int x1,y1,x2,y2;int x0=320;int y0=250;cleardevice();setbkcolor(BLACK);setcolor(BLUE);for(i=0;i<=120;i=i+3)arc(x0,y0+r,30+i,30+i+3

36、,r);x1=(int)(x0-0.866*r)-5;y1=(int)(y0-0.5*r)+11;for(i=0;i<=120;i=i+3)arc(x1,y1,-90+i,-90+i+3,r);x2=(int)(x0+0.866*r)-11;y2=(int)(y0-0.5*r);for(i=0;i<=120;i=i+3)arc(x2,y2,150+i,150+i+3,r);out_hz(200-22,80,"谢",3,25,YELLOW);out_hz(400-22,80,"谢",3,25,YELLOW);delay(200);out_hz(

37、200-22,180,"使",3,25,YELLOW);out_hz(400-22,180,"用",3,25,YELLOW);out_hz(400-22,180,"用",3,25,YELLOW);out_hz(350,400,"自动化六班",0,20,YELLOW);out_hz(480,400,"彭军才",0,20,YELLOW);out_hz(550,400,"程攀",0,20,YELLOW);setcolor(YELLOW);x=(int)(x0-0.866*r)-5;

38、y=(int)(y0-0.5*r)+11;for(i=0;i<=120;i=i+3)if(bioskey(1)break;arc(x,y,-90+i,-90+i+3,r);delay(30);x=(int)(x0+0.866*r)-11;y=(int)(y0-0.5*r);for(i=0;i<=120;i=i+3)if(bioskey(1)break;arc(x,y,150+i,150+i+3,r);delay(30);for(i=0;i<=120;)if(bioskey(1)break;arc(x0,y0+r,30+i,30+i+3,r);i=i+3;delay(30);d

39、elay(200);/pcx图片显示void Set_Palette_Register(int index,RGB_color_ptr color) outp(PALETTE_MASK,0xff); outp(PALETTE_REGISTER_WR,index); outp(PALETTE_DATA,color->red); outp(PALETTE_DATA,color->green); outp(PALETTE_DATA,color->blue);void PCX_Load_Screen(char *filename,int enable_palette) / this

40、function loads a pcx file into a picture structure, the actual image / data for the pcx file is decompressed and expanded into a secondary buffer / within the picture structure, the separate images can be grabbed from this / buffer later. also the header and palette are loaded FILE *fp; unsigned cha

41、r far *video_buffer=(char far *)0xA0000000L; int num_bytes,index; unsigned int count; unsigned char data; RGB_color *palette; palette=(RGB_color *)malloc(256*sizeof(RGB_color); if(palette!=NULL) if(fp = fopen(filename,"rb")!=NULL) fseek(fp,128L,SEEK_SET); / load the data and decompress int

42、o buffer count=0; while(count<=(unsigned int)SCREEN_WIDTH * SCREEN_HEIGHT) / get the first piece of data data = getc(fp); / is this a rle? if (data>=192 && data<=255) / how many bytes in run? num_bytes = data-192; / get the actual data for the run data = getc(fp); / replicate data i

43、n buffer num_bytes times while(num_bytes->0) / image->buffercount+ = data; video_buffercount+=data; / end while / end if rle else / actual data, just copy it into buffer at next location /image->buffercount+ = data; video_buffercount+=data; / end else not rle / end while for (index=0; index

44、<256; index+) / get the red component paletteindex.red = (getc(fp) >> 2); / get the green component paletteindex.green = (getc(fp) >> 2); / get the blue component paletteindex.blue = (getc(fp) >> 2); / end for index fclose(fp); fp=NULL; / change the palette to newly loaded palet

45、te if commanded to do so if (enable_palette) for (index=0; index<256; index+) Set_Palette_Register(index,(RGB_color_ptr)&paletteindex); / end for index / end if change palette video_buffer=NULL;free(palette); void Set_Video_Mode(int mode)union REGS inregs,outregs;inregs.h.ah=0;inregs.h.al=(un

46、signed char)mode;int86(0x10,&inregs,&outregs);/pcx显示主函数 有停顿void pcx(char *pcx)closegraph();Set_Video_Mode(VGA256); PCX_Load_Screen(pcx,1); getch(); closegraph(); init_480(); pcx=NULL;/无停顿void pcx_1(char *pcx)closegraph();Set_Video_Mode(VGA256); PCX_Load_Screen(pcx,1); closegraph(); init_480(

47、); pcx=NULL;/地标图片显示模块void picture_show_1(int x,int y,int mousekey)/判断显示哪点图片 if(mousekey=1) if(x>140&&x<160&&y>120&&y<140) picture_show_2(1); cleardevice(); menu_main(); else if(x>20&&x<40&&y>440&&y<460) picture_show_2(2); cleardevice(); menu_main();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论