课程设计的要求
- 要求设计一个具有绘图功能的程序,可以手工以状态转换图的方式绘制自动机;
- 图形化的自动机可以保存,读取;
- 根据状态转换图得出自动机的状态转换矩阵;
- 根据状态转换矩阵,自动绘制出状态转换图。
开发环境
- Manjaro Linux(内核版本5.9.11)操作系统
- Qt Creator 4.13.3
- QMake版本为 3.1,GCC版本为10.2.0
概要设计
打开软件,通过侧边栏选择模式,可选模式有五种,分别是移动,添加点,添加边,删除,修改,通过鼠标点击切换想用的模式。各模式功能如下:
- 移动:鼠标单击图上的点(对应状态),长按不松手,移动鼠标,点会跟随鼠标移动,与之相连的边自动调整。
- 添加点:在图中一个位置单击鼠标,弹出提示框,输入点名称(状态名)及是否是初态/终态,点击确认后,该位置新增一个点。
- 添加边:连续点击两个点A,B,弹窗提示输入边的信息(输入符号),点击确认后增加一条边,A,B可以是同一个点,添加自环。
- 删除:鼠标点击边则删除边,点击点则删除点和与它相连的所有边。
- 修改:鼠标点击边或者点,弹出对应添加状态中出现的弹窗,在弹窗中修改信息即可。
按键功能:
- 减号:缩小图形
- 加号或等号(一般键盘上加号与等号在同一个按键上):放大图形
- 空格:随机打乱点的位置
- 鼠标滚轮:也可以放大缩小图形
自动调整:
- 此功能可以自动调整点的位置,使图形比较自然,实现方法参考了Qt的官方文档中的Elastic Nodes Example,核心算法是每个点间有斥力,与点到点的距离平方成正比,边有拉力,与边长的平方成正比。设置定时器,每隔一段时间计算每个点的受力情况,更新点的位置,当受力平衡时,图是舒展开的,较美观。
- 自定义实现了继承QGraphicsItem的Node类和Edge类,其中保存了点/边