一个数组是一个容器. 对其进行可视化, 主要针对数组的值查找,指定位置插入,指定位置删除进行可视化. 软件针对每个数据结构可视化分两个方面: 教学模式:主要针对数据结构每个方面进行讲解,可动画演示. 实践模式:允许使用者自己通过增加/删除/搜索执行数据结构支持的操作,且将操作过程以动画形式展现.
一个描述点/线/矩形/...的基础结构体系
一个描述2D几何对象的体系
通过上述类型, 我们既可以描述单独的2D点/线/椭圆/矩形/多段线/文字对象, 又可以通过GeometryGroup描述这些对象的任意层次的嵌套和叠加. 矩阵支持 为了实现2D对象的运行与变化, 我们需要对2D对象进行变换, 而变换依赖于矩阵.
2D变换体系
为了完成一个2D对象的绘制,我们构建一个Drawing体系
一个Drawing基类实现一个2D对象绘制
为了完成2D对象间父子关系, 一父多子,控制属性等信息的描述, 我们需要对2D对象进行建模.需要一个Model体系来支撑.
2D动画需要不断给2D模型对象发送控制信息, 来实时控制2D对象的呈现,并实时绘制. 一般采用1秒50次的刷新频率来保持动画呈现的流畅. 为了实现动画的驱动,需要一个机制: 1.生成原始控制文件 2.对控制文件进行解析得到NCCODE. 每个NCCODE描述的是一段时间下各个对象的运动. 3.对NCCODE进行插补得到NCSTEP, 以得到一个设定的较小的时间间隔内对应的各个2D对象的运动量. 4.对NCSTEP进行处理,每个NCSTEP处理后, 2D对象的属性被相应更新,据此可以进行对应的界面刷新. 源源不断的解析文件,产生NCCODE NCCODE产生源源不断的NCSTEP 界面线程再每隔一个刷新周期取一个NCSTEP来更改2D对象属性, 并渲染显示. 这样就完成了一个持续的2D动画过程. 动画服务
这里的 解析动画驱动文件产生NCCODE 对NCCODE进行插补产生NCSTEP 对NCSTEP进行处理得到NCSHOW 界面线程通过定时器取NCSHOW进行显示 上述4个过程,每个过程均采用一个线程实现. 每个过程对下一个过程来说是生产者,对上一个来说是消费者. 这样也构成了一个四个线程协作来完成一个任务的流水线.
针对要支持的NCCODE指令,我们用一个体系来描述, 这样我们可以支持移动/改变颜色/提示/...等各类控制指令, 且易于动态扩展.
每个NCCODE需要经过插补,产生NCSTEP, 以方便后续使用. 一般一个NCCODE类型有一个与之对应的NCSTEP类型.
为了提高动画绘制效率, 对于产生的NCSTEP, 我们可让一个线程负责, 取产生的NCSTEP, 并依据NCSTEP进行对2D模型的修改, 将修改后的模型进行绘制, 这样界面线程取出的NCSHOW里面包含了依据绘制好的图片, 就不需要每次界面线程在定时回调里再做更改模型, 绘制模型的工作了. 可以提升动画流畅性. 为此构造一个NCSHOW体系,存储NCSTEP处理结果.
- 项目进展 1.通用2D建模&渲染已经完成. 2.2D动画驱动已经完成. 由于时间关系,仅针对数组进行了可视化的应用. 后续有时间可以扩展到对 链表/栈/队列/堆/哈希表/二叉树/红黑树/图/...等结构的支持, 以构成一个完备的软件. - 基于的技术&支持的平台 1.基于C++&QT在Linux平台构建. 2.目前客户端软件仅在Linux桌面运行,由于Qt的跨平台特性, 易于移植到Windows客户端,待以后处理.
1.C++ Primer 2.Qt 5.9 C++开发指南 3.图形学 4.线性代数 5.Unix环境高级编程 6.算法导论