目录
- 需求分析
- 需求设计
- ui设计
1. 需求分析
整体目标:写一个简单的NS模型
场景:一个周期性的直通道(右端出,左端进),多辆车按一个简化版的NS模型,在正中间运动,示意图如下
image.png
简化版的NS模型
1.加速:有加速的趋势,且不会超过最大速度
2.减速:车辆前方距离不够时,车辆要减速来避免相撞。
3.更新:车辆根据其速度进行运动
公式化一下:设加速度
a=1 Cell/(T^2)
,其中Cell代表一个元胞的尺寸(此处不妨假设为0.4m),T代表更新的时间步长(假设为0.4s)1.加速:t时刻的期望期望速度
V=V(t)+a
,2.减速:车的最终速度
V(t+T)=min(Vmax,V,D/a)
,三者(车的最大速度,车的期望速度,场景可允许速度)之间取最小,D是车前可用空间,车的最大速度设为5个格子每时间步长。3.更新:t+T时刻的位置,
X(t+T)=X(t)+V
2. 需求设计
1.信息的存储:对每个车需要进行车的数据记录(速度,位置),可以定义一个车的类MyVehicle
2.场景的初始化(用按钮控制):初始化车的位置和速度,并绘图
- 场景的更新:采用随机更新的方式,调用更新函数后,绘图。
3.ui界面的设计
3.1 主窗口的规划
假设通道100个格子长,10个格子宽,每个格子10像素的话。至少要1000X100,考虑到控件以及空间的预留,选中后如下进行设置。
最大最小尺寸相等,以保证不会被拉伸和缩放
先考虑程序控制按钮和车辆数量输入框的布局,依次拖入,大致排成一排,如下图所示,其中控件的文本显示通过双击修改。
image.png
然后通过布局使窗口更好看。
加入三个水平弹簧,全选中后,点击水平布局
image.png
拖入垂直布局盒并加入垂直弹簧,用来给出结果图的空间。
image.png
点击主窗口widget,选择垂直布局,
image.png
运行,看看。(可以对组件改名,方便引用)
还行的布局
3.2 按钮的槽函数
由于是对按钮进行点击,来跑模型,所以需要给按钮写响应点击的函数。分别对三个按钮右键,转到槽,选择click槽函数,让QT自动帮你生成按钮对应的响应函数
image.png
cpp文件对应的槽函数
槽函数需要实现不同的功能,开始按钮点击要开始模拟模型,暂停是暂停计时器函数(先不考虑),结束是关闭窗口。
处于方便观查,补加上一个“确认按钮”(btnOk),观察初始化的场景,如下图
补加按钮
这样槽函数内先调用几个没有实现的空函数,其中关于计时器的后面会提到。
槽函数的简单填写
现在的效果:
点击结束按钮会结束