目 录
1 设计任务 1
2 需求分析 3
3 概要设计 4
3.1抽象数据类型定义 …4
3.2 总体设计. 4
3.3用户界面设计…5
3.4存储结构 6
3.5关键算法…8
4 详细设计与算法 11
5 测试结果 51
6 课程设计总结 57
参考文献 57
附录 58
2 需求分析
本演示程序是在Visual Studio环境中编写,完成交通图导航系统的各项功能。
导航系统的基本功能有:实现地图的模拟,向地图中添加、删除、修改、查找地点信息、路线信息,查找起点和终点之间的最优路径。
1、 地图信息:保存在文件中,包括各个地区的基本信息,路线信息等
2、 交通工具信息:包括运行时间信息、交通工具信息,例如:起始时间、结束时间信息等
3、 程序所能达到的功能:向地图中添加、删除、修改、查找地点信息、路线信息,查找起点和终点之间的最优路径
4、 测试数据:
1) 调试程序后会弹出一个窗口,进行选择“管理”模式还是“用户”模式。
2) 首先选择“用户”模式,然后进行登录进入界面。
3) 初始界面显示为有17个城市的地图,两城市之间有交通来往的有连线,并且连线上有两城市之间火车和汽车行驶的距离(前者为火车,后者为汽车)(为了更好区分,两者数值相差较大)。
4) 任选起点(可选17个城市,以天津为例)、终点(可选17个城市,以南京为例)和类型(目前有火车、汽车两种方式),点击查询。
5) 地图中会出现从起点(天津)途径某些城市到终点(南京)的连线(红色)。
6) 地图上面会显示乘坐火车/汽车走过的距离(路程长度)。
7) 右上角还可以查询“班次信息”,管理者模式可以添加和删除。
8) 查询完两城市之间的信息后,可以重新选择起点、终点和类型,进行另外两城市之间的信息查询。
9)点击右上角关闭按钮即可退出程序。
#include "pch.h"
#include "Canvas.h"
int Canvas::s_gdiplus_conter;
Gdiplus::GdiplusStartupInput Canvas::s_gdiplus_input;
ULONG_PTR Canvas::s_gdiplus_token;
Canvas::Canvas() : m_wnd(NULL), m_idc(0), m_fps(0), m_current(0) {
startup();
}
Canvas::~Canvas() {
shutdown();
}
void Canvas::init(Engine* engine, CWnd* wnd, int idc) {
m_engine = engine;
m_wnd = wnd;
m_idc = idc;
}
void Canvas::update() {
countFPS();
paintBuffer();
}
void Canvas::paintBuffer() {
//获取需要绘图的控件窗口
CWnd* cwnd = m_wnd->GetDlgItem(m_idc);
//获取控件窗口的DC
CDC* dc = cwnd->GetDC();
CRect rect;
//得到控件的客户区大小
cwnd->GetClientRect(&rect);
//创建一个缓冲DC(双缓冲加速绘图效果)
CDC memdc;
//将缓冲DC设置成与窗口DC兼容模式
memdc.CreateCompatibleDC(dc);
//设置一个缓存位图
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(dc, rect.Width(), rect.Height());
memdc.SelectObject(&bitmap);
//使用GDI+绘图
Gdiplus::Graphics graphics(memdc.GetSafeHdc());
//提高绘制质量
graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
graphics.SetCompositingQuality(Gdiplus::CompositingQualityHighQuality);
graphics.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAliasGridFit);
Gdiplus::SolidBrush bgcolor(Gdiplus::Color(0xf0, 0xf8, 0xff));
//绘制背景色
graphics.FillRectangle(&bgcolor, rect.left, rect.top, rect.Width(), rect.Height());
updateSprites(graphics);
graphics.ReleaseHDC(memdc.GetSafeHdc());
//将缓冲DC数据写入窗口DC
dc->BitBlt(0, 0, rect.Width(), rect.Height(), &memdc, 0, 0, SRCCOPY);
//使控件失效重绘
//cwnd->Invalidate();
//cwnd->UpdateWindow();
}
void Canvas::updateSprites(Gdiplus::Graphics& graphics) {
m_engine->update(graphics);
}
void Canvas::countFPS() {
time_t current = time(NULL);
if (m_current == current) {
++m_fps;
} else {
m_engine->countFPS(m_fps);
m_fps = 1;
m_current = current;
}
}
void Canvas::startup() {
if (s_gdiplus_conter == 0) {
Gdiplus::GdiplusStartup(&s_gdiplus_token, &s_gdiplus_input, NULL);
}
++s_gdiplus_conter;
}
void Canvas::shutdown() {
--s_gdiplus_conter;
if (s_gdiplus_conter == 0) {
Gdiplus::GdiplusShutdown(s_gdiplus_token);
}
}