diff --git "a/doc/\347\224\260\351\207\216-\344\270\252\344\272\272\346\212\245\345\221\212.md" "b/doc/\347\224\260\351\207\216-\344\270\252\344\272\272\346\212\245\345\221\212.md" index 6504aed..c566fed 100644 --- "a/doc/\347\224\260\351\207\216-\344\270\252\344\272\272\346\212\245\345\221\212.md" +++ "b/doc/\347\224\260\351\207\216-\344\270\252\344\272\272\346\212\245\345\221\212.md" @@ -15,38 +15,38 @@ ### 设计思路方案与实现简述 * **在绘图界面时Add,Delete,Find,Clear键的槽函数** - * 将按键点击事件与相对应的函数进行绑定 - * 根据相应的按键判断是哪种数据结构 - * 根据暴露出来的数据,执行对应的命令 - * 详见`project/View/drawwindow.*` + * 将按键点击事件与相对应的函数进行绑定 + * 根据相应的按键判断是哪种数据结构 + * 根据暴露出来的数据,执行对应的命令 + * 详见`project/View/drawwindow.*` * **在绘图界面画出相应的数据结构** - * 绘图事件的回调函数 + * 绘图事件的回调函数 ` void paintEvent(QPaintEvent *); ` - * 画出数据结构的过程分成了两个部分 - * 第一部分是先遍历整棵树,判断一个节点是否有左右子节点,如果有左子树则画出左边的分支,如果有右子树则画出右边的分支 - * 在画分支的时候根据某一节点到根节点的深度和该节点在中序遍历中的序号来判断该节点在屏幕中的坐标,根据两个节点中心坐标的差值可以计算出线的起始和终止坐标 - * 画线之前根据这条路径是否是在查找的路径上去修改颜色,如果在路径上则设为红色,否则为白色 - * 第二个部分是画节点,重新层序遍历树,计算每个节点中心的坐标 - * 画节点之前根据该节点是否是要查找的节点去修改节点的颜色,如果是要查找的节点则把该节点设为红色,否则为白色 - * 详见`project/View/draw.*` + * 画出数据结构的过程分成了两个部分 + * 第一部分是先遍历整棵树,判断一个节点是否有左右子节点,如果有左子树则画出左边的分支,如果有右子树则画出右边的分支 + * 在画分支的时候根据某一节点到根节点的深度和该节点在中序遍历中的序号来判断该节点在屏幕中的坐标,根据两个节点中心坐标的差值可以计算出线的起始和终止坐标 + * 画线之前根据这条路径是否是在查找的路径上去修改颜色,如果在路径上则设为红色,否则为白色 + * 第二个部分是画节点,重新层序遍历树,计算每个节点中心的坐标 + * 画节点之前根据该节点是否是要查找的节点去修改节点的颜色,如果是要查找的节点则把该节点设为红色,否则为白色 + * 详见`project/View/draw.*` * **在View层提供绑定数据和命令的接口** - * 绑定数据结构(如`void bind_avl_Tree(shared_ptr> bt)`) - * 绑定命令(如` void bind_bst_insert(shared_ptr cb)`) - * 使用`shared_ptr`来维护继承于`CommandBase`的子命令(如`shared_ptr avl_insert`) - * 详见`project/View/draw.*` + * 绑定数据结构(如`void bind_avl_Tree(shared_ptr> bt)`) + * 绑定命令(如` void bind_bst_insert(shared_ptr cb)`) + * 使用`shared_ptr`来维护继承于`CommandBase`的子命令(如`shared_ptr avl_insert`) + * 详见`project/View/draw.*` * **在View层中设计通知** - * 设计接受命令的通知`TreeCommandNotification`,继承`ICommandNotification` - * 如果命令正常完成则什么都不做,如果命令没有完成则根据暴露出来的字符串信息判断是什么错误 - * 设计数据结构属性改变的通知`TreePropertyNotification`,继承`IPropertyNotification` - * 如果数据结构的属性发生改变,则触发强制绘图事件重新绘图 - * 详见`project/View/Sinks/.*` + * 设计接受命令的通知`TreeCommandNotification`,继承`ICommandNotification` + * 如果命令正常完成则什么都不做,如果命令没有完成则根据暴露出来的字符串信息判断是什么错误 + * 设计数据结构属性改变的通知`TreePropertyNotification`,继承`IPropertyNotification` + * 如果数据结构的属性发生改变,则触发强制绘图事件重新绘图 + * 详见`project/View/Sinks/.*` #### 单元测试 * 测试画树函数的正确性 - * 自己先构建好一个二叉搜索树,然后调用绘图函数去画出这个二叉搜索树,检验是否正确 - * 测试代码 + * 自己先构建好一个二叉搜索树,然后调用绘图函数去画出这个二叉搜索树,检验是否正确 + * 测试代码 ``` #include "BST.h" #include "draw.h" @@ -66,7 +66,7 @@ return 0; } ``` - * 测试结果 + * 测试结果 ![testDraw](https://github.com/SummerZJU/CSummerZJU/blob/master/image/View/testDraw.png "testDraw") *** @@ -74,25 +74,25 @@ ### 第二轮迭代工作 #### 设计任务 * ***View设计*** - * 美化数据结构在界面中的显示 - * 在View层中加入左偏堆和伸展树相关的数据和命令的绑定 + * 美化数据结构在界面中的显示 + * 在View层中加入左偏堆和伸展树相关的数据和命令的绑定 * ***ViewModel设计*** - * 在ViewModel层中加入绑定模型的方法 - * 在ViewModel层提供获取命令的接口 + * 在ViewModel层中加入绑定模型的方法 + * 在ViewModel层提供获取命令的接口 #### 设计思路方案与实现简述 * **美化数据结构在界面中的显示** - * 取消了画节点时的`Brush`填充,变成了一个空心圆 - * 画线的时候起始点和终止点不设为圆心,改为均在圆上,即将线的长度缩短了一个直径的长度 - * 对于圆心的位置进行微调,重新计算出圆心坐标,让圆心在左右子树分支线的中心 - * 执行`Find`命令后,让目标节点的圆改变颜色,而不是全部改变颜色 - * 详见`project/View/draw.*` + * 取消了画节点时的`Brush`填充,变成了一个空心圆 + * 画线的时候起始点和终止点不设为圆心,改为均在圆上,即将线的长度缩短了一个直径的长度 + * 对于圆心的位置进行微调,重新计算出圆心坐标,让圆心在左右子树分支线的中心 + * 执行`Find`命令后,让目标节点的圆改变颜色,而不是全部改变颜色 + * 详见`project/View/draw.*` * **在View层中加入左偏堆和伸展树相关的数据和命令的绑定** - * 绑定数据结构(如`void bind_leftist_Tree(shared_ptr> bt)`) - * 绑定命令(如`void bind_leftist_insert(shared_ptr cb)`) - * 使用`shared_ptr`来维护继承于`CommandBase`的子命令(如`shared_ptr splay_find`) - * 详见`project/View/draw.*` + * 绑定数据结构(如`void bind_leftist_Tree(shared_ptr> bt)`) + * 绑定命令(如`void bind_leftist_insert(shared_ptr cb)`) + * 使用`shared_ptr`来维护继承于`CommandBase`的子命令(如`shared_ptr splay_find`) + * 详见`project/View/draw.*` * **在ViewModel层中加入绑定模型的方法** - * 在ViewModel层中绑定新加入的左偏堆和伸展树模型 + * 在ViewModel层中绑定新加入的左偏堆和伸展树模型 ` void bindModelSplayTree(shared_ptr> splayTree); @@ -102,9 +102,9 @@ void bindModelLeftistHeap(shared_ptr> leftistHeap); ` - * 详见`project/ViewModel/ViewModel.*` + * 详见`project/ViewModel/ViewModel.*` * **在ViewModel层提供获取命令的接口** - * 在ViewModel层中提供新加入的左偏堆和伸展树获取命令的接口 + * 在ViewModel层中提供新加入的左偏堆和伸展树获取命令的接口 ` shared_ptr getCommandSplayTreeInsert() const; @@ -134,38 +134,38 @@ shared_ptr getCommandLeftistHeapClear() const; ` - * 详见`project/ViewModel/ViewModel.*` + * 详见`project/ViewModel/ViewModel.*` **** ### 第三轮迭代工作 #### 设计任务 * ***View设计*** - * 在View层中加入红黑树和哈夫曼树相关的数据和命令的绑定 - * 修改了画树函数,给红黑树特殊提供一个函数 - * 在View层中提供错误事件的接口 + * 在View层中加入红黑树和哈夫曼树相关的数据和命令的绑定 + * 修改了画树函数,给红黑树特殊提供一个函数 + * 在View层中提供错误事件的接口 * ***ViewModel设计*** - * 在ViewModel层中加入绑定模型的方法 - * 在ViewModel层提供获取命令的接口 + * 在ViewModel层中加入绑定模型的方法 + * 在ViewModel层提供获取命令的接口 #### 设计思路方案与实现简述 * **在View层中加入红黑树和哈夫曼树相关的数据和命令的绑定** - * 绑定数据结构(如`void bind_rb_Tree(shared_ptr> bt)`) - * 绑定命令(如`void bind_hf_insert(shared_ptr cb)`) - * 使用`shared_ptr`来维护继承于`CommandBase`的子命令(如`shared_ptr rb_find`) - * 详见`project/View/draw.*` + * 绑定数据结构(如`void bind_rb_Tree(shared_ptr> bt)`) + * 绑定命令(如`void bind_hf_insert(shared_ptr cb)`) + * 使用`shared_ptr`来维护继承于`CommandBase`的子命令(如`shared_ptr rb_find`) + * 详见`project/View/draw.*` * **修改了画树函数,给红黑树特殊提供一个函数** - * 由于红黑树特殊的性质,每个节点有一个额外的颜色属性,所以在画树的时候需要访问颜色属性,而其他数据结构则不需要这个颜色属性 - * 给红黑树提供了一个特殊的绘图函数,在绘图事件时先判断是哪种数据结构,如果是红黑树在执行命令的时候就调用这个特殊的绘图函数,其他数据结构则调用第二轮迭代中的绘图函数 - * 将红黑树`Find`操作中的路径和目标节点的颜色修改为黄色,来避免和树节点本身的红色属性冲突 - * 详见`project/View/draw.*` + * 由于红黑树特殊的性质,每个节点有一个额外的颜色属性,所以在画树的时候需要访问颜色属性,而其他数据结构则不需要这个颜色属性 + * 给红黑树提供了一个特殊的绘图函数,在绘图事件时先判断是哪种数据结构,如果是红黑树在执行命令的时候就调用这个特殊的绘图函数,其他数据结构则调用第二轮迭代中的绘图函数 + * 将红黑树`Find`操作中的路径和目标节点的颜色修改为黄色,来避免和树节点本身的红色属性冲突 + * 详见`project/View/draw.*` * **在View层中提供错误事件的接口** - * 设计错误事件的基类`Error`对话框,继承于`QDialog` - * 对于插入错误、删除错误和查找错误设计不同的子类(`InsertError/DeleteError/FindError`),继承于错误基类`Error`对话框。 - * 接受命令通知发出以后如果未正常完成,则根据不同的错误类型弹出相应类型的对话框 + * 设计错误事件的基类`Error`对话框,继承于`QDialog` + * 对于插入错误、删除错误和查找错误设计不同的子类(`InsertError/DeleteError/FindError`),继承于错误基类`Error`对话框。 + * 接受命令通知发出以后如果未正常完成,则根据不同的错误类型弹出相应类型的对话框 * **在ViewModel层中加入绑定模型的方法** - * 在ViewModel层中绑定新加入的红黑树和哈夫曼树模型 + * 在ViewModel层中绑定新加入的红黑树和哈夫曼树模型 ` void bindModelRBT(shared_ptr> rbt); @@ -175,9 +175,9 @@ void bindModelHFTree(shared_ptr> hfTree); ` - * 详见`project/ViewModel/ViewModel.*` + * 详见`project/ViewModel/ViewModel.*` * **在ViewModel层提供获取命令的接口** - * 在ViewModel层中提供新加入的左偏堆和伸展树获取命令的接口 + * 在ViewModel层中提供新加入的左偏堆和伸展树获取命令的接口 ` shared_ptr getCommandHFTreeInsert() const; @@ -211,7 +211,7 @@ shared_ptr getCommandRBTClear() const; ` - * 详见`project/ViewModel/ViewModel.*` + * 详见`project/ViewModel/ViewModel.*` ### 个人心得体会 * 第一次接触到大型程序的多人协作编写。与以前所经历的组队进行程序开发不同,这次采用了`MVVM`模型,使得各个模块之间的耦合度大大降低,每个人只要知道自己内部是怎么做的即可,而不需要去了解其他人模块的内部是如何实现的。