十字路口模拟
这个模拟程序前前后后写了半个月。后续的话可能会继续维护。
前期:测试 MO 的函数以及老师提供的 Demo 程序。
中期:设计、代码、重构
后期:优化、整合模拟参数、界面
最重要的是设计以及代码阶段。
设计的重要性:
如果一开始没有一个良好的设计,程序是很难具有拓展性的。
十字路口模拟必须有十字路口的道路的数据,可以在 ArcMap 中绘制,存为 shapefile 格式数据,用 MO 提供的全局函数 AddLayer(m_map, pathName) 打开并显示到 m_map 控件上。因为我设计的道路有长宽,在 ArcMap 中绘制十字路口数据都是输入具体的点坐标,坐标与坐标之间都是有联系的,无非就是平面几何关系。我就打算用 MO 自动生成路口数据,在程序中 pt.SetX(..) 与在 ArcMap 中输入是等价的。想法很简单,觉得实现也很简单,MO 肯定有相应的接口。(由此可以看出我对 MO 的不熟悉)
车、灯、人都是对象,都具有属性。面向对象的设计应该是很适用的。但由于MO 与 MFC 结合的特殊性(待会会说),面向对象会增添不少的代码,开辟的资源空间也会多不少。我写了一篇文档探讨此程序用面向过程还是面向对象实现,最终发现,面向对象的话,实现的逻辑更清楚,调试、定位更方便。面向过程实现虽然代码少,但费劲,不利于维护。目前的代码量接近 2000,面向过程的话我目前还 hold 不住。
MO 挂接动态数据一般是在 MoTrackingLayer 图层,这是一个永远在 CMap 控件最上层的一个图层,获取只需调用 m_map.GetTrackingLayer() 的返回值即可。此图层的数据刷新是完全独立的。仅仅有图层还不够,需要有数据。MO 提供了 MoGeoEvent 对象,可以理解为是一个点、线、面对象,但是具有以下的功能:
-
GetX() GetY() SetX() SetY()
获取及设置自身的坐标
-
Move() MoveTo(doube X, double Y)
平移以及移动到点 (X, Y)
-
SetSymbolIndex(long i)
设置该对象采用的符号(符号库可以在 MoTrackingLayer 对象中设置好,i 即是该符号库的索引)
理论上,具有这三个特性就够了,这是 MO 对整个十字路口程序模拟做贡献最大最核心的地方。MO 刷新数据是局部刷新。如果用 Win32 API 写这个程序,数据刷新会让问题变得很棘手,用 matlab 写的话,估计效率很低。
MoGeoEvent 是与 MoTrackingLayer 相关联的。MoGeoEvent 对象想要到 MoTrackingLayer 图层上,还得调用 MoTrackingLayer.AddEvent() 接口,返回一个 MoGeoEvent 对象。
至此,车、人移动的问题、灯颜色变化的问题全部解决了。
暂时写到这,以上。