- 提供景点信息查询并打开介绍页图片
- 提供两点间最短路径查询并动态演示
- 多个点的最佳路径查询
- 模糊搜索景点名称
- 遇到复杂路口时显示路口实景
- 图形化显示和放大镜功能提供
- 提供两点间所有路径查询动态演示、将所有的路径存入链表中便于后期筛选
本文主要介绍的是整个系统的概述,加粗部分模块包括其代码及算法将另开文详细介绍
- 文件存储有关图的信息,有邻接矩阵和点的位置坐标文件,还有一个存储景点的名称及对应序号的文件
- 每个景点对应唯一的编号,同时会有只用来表示连通关系的中转点,前n个为景点,后m个为中转点,中转点无法被查询,但是在显示路径中会被加入
- 点的坐标测定以及介绍页的制作使用photoshop完成
- 使用opencv实现可视化操作
- 通过点的坐标与连通关系以及地图的比例尺(每像素代表多少米)计算距离
- 修改后的深度优先遍历方法寻找两点间所有路径
- dijkstra算法求两点间最短距离
- 通过对选出的几个点的最短路径的长度的排列组合,选出其中连接这几个点的最短的路径
- 动态演示通过在两点间不断画线不断更新视图实现
- 根据一个路径数组动态演示路径,使用OpenCV鼠标事件实现鼠标跟随放大功能。鼠标事件函数在动态演示完成后自动调用,能够让用户看清路径的细节,当演示的路线(红线)到达复杂路口(一般为不容易找到的路)时,自动打开实景图。由于OpenCV没有缓存清除函数,无法像OpenGL之类方便画出动画,我使用了cvWaitKey()函数作为延时函数,将两点间的路径划分为若干直线,每条路径划分DYNAMIC_NUM条小直线,每画一条小直线就显示一次,这样还意外实现了走大路时动画快,转弯时动画慢的人性化要求,更改其数值可调整动画速度,为了压缩内存,只对原图进行由map1ROI区域控制的显示并只在演示完后进行绘制,而使用缩略图mapshow进行动态绘制,大大减少了内存占用。
- 监听鼠标事件,当鼠标移动时根据xy的值计算并设置map1和mapshow的ROI区域,算法的关键在于判断边界情况,由于绘制的区域为正方形(大小可设置),因此当鼠标移动到边界附近时会出现设置区域超出图形的错误导致程序出错,所以我使用if函数罗列所有边界情况并进行处理于是就实现了鼠标在边界附近时就好像有堵墙一样的效果。
- 由于Dynamic_Show()函数动态演示用时过长,并且输出所有路径时路径的数量较多,所以使用本函数,以一整条路径为单位进行动态演示,每0.5秒刷新一次,能够检查路径的正确性,使用RNG类为路径赋予随机颜色。
- 通过检测Matrix(邻接矩阵)和Points(点的坐标)来输出一副含有所有路径和所有点以及所有程序内部编号的图,用于检测是否录入数据正确。也是使用了随机颜色。画线使用了line()函数,画圆使用了circle()函数,输出编号使用了putText()函数。
- 使用非递归方法,另开一文介绍
- 模糊搜索函数,考虑到游客可能输入不对或输入不全学校景点的名字,使用这个函数可以自动匹配含有输入字符的景点,同时也支持精确查找。使用goto语句是为了简化函数结构。输入y可确认模糊匹配结果、n可否定结果并继续匹配、e可跳出模糊搜索重新输入使用精确搜索。主要使用了string类型里的函数find(),它可以搜索string类型中是否含有字符串,并返回它出现的次序,如果没有则返回为-1。
- 通过使用模糊搜索,打开对应的介绍页的图片文件,主要是利用了被重载的+运算符的性质,使其可以直接合成一个文件路径。
- 由于原图过大,因此为用户展示的窗口使用CV_INTER_AREA方式压缩,使用此压缩方式可以有效去除压缩时产生的斜纹,并将程序占用内存由2G多降低到100M左右,同时,设定了一个缩放倍数scale,可以根据不同系统、不同屏幕、不同分辨率进行调整。