十字路口模拟(一)

十字路口模拟


这个模拟程序前前后后写了半个月。后续的话可能会继续维护。

前期:测试 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 对象,可以理解为是一个点、线、面对象,但是具有以下的功能:

  1. GetX() GetY() SetX() SetY()

获取及设置自身的坐标

  1. Move()    MoveTo(doube X, double Y)

平移以及移动到点 (X, Y)

  1. SetSymbolIndex(long i)

设置该对象采用的符号(符号库可以在 MoTrackingLayer 对象中设置好,i 即是该符号库的索引)


理论上,具有这三个特性就够了,这是 MO 对整个十字路口程序模拟做贡献最大最核心的地方。MO 刷新数据是局部刷新。如果用 Win32 API 写这个程序,数据刷新会让问题变得很棘手,用 matlab 写的话,估计效率很低。

MoGeoEvent 是与 MoTrackingLayer 相关联的。MoGeoEvent 对象想要到 MoTrackingLayer  图层上,还得调用 MoTrackingLayer.AddEvent() 接口,返回一个 MoGeoEvent  对象。


至此,车、人移动的问题、灯颜色变化的问题全部解决了。



暂时写到这,以上。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值