具体信息见https://github.com/xubenhao/VisualAlgorithm/wiki
如果上述网址无法显示图片,可参考
https://blog.csdn.net/x13262608581/article/details/113103356
1.通用2D建模
a.Struct模块
用于描述值类型的点/线/矩形/多段线/...等基础集合对象
b.Geometry模块
更近一步描述了
-基础集合对象,通过容纳一个Struct类型作为数据成员实现
-描述了对基础集合对象的变换,通过容纳一个Transform基类作为数据成员实现
-实现了每个支持的几何对象的自绘制.每个Geometry下类型提供Draw接口,每个类型的接口实现中绘制自身.
-提供了Group类型.借助该类型实现几何对象间父子关系,一父多子,多层嵌套,且Group中元素允许为Group类型.
这样可以构造出可由基础2D对象建模的任意复杂的2D几何对象.
c.Matrix模块
2D对象的变换包括平移,旋转,放缩,这些均通过对点执行矩阵运算得到.
图形学中的变换/移动,不论2D/3D最后都会归结到对点进行矩阵变换上面来.
d.Transform模板
对变换更近一步的封装.
-支持线性/旋转/放缩/矩阵变换,每类变换对应一个Transform模块中类型
-提供Group类型,借助该类型可以实现多层变换,且Group中元素允许为Group类型,进一步灵活化了复合变换功能.
2.通用2D渲染
a.Drawing模块
用于实现一个独立控制的模型对象的渲染
-Drawing中包含Geometry对象用于描述独立控制的模型对象的几何属性
-Drawing中包含Pen,Bursh,Font对象用于描述独立控制的模型对象的画笔属性,画刷属性,文字属性
-提供绘制接口,在接口实现中借助于几何对象,画笔属性,画刷属性,文字属性实现几何对象的渲染
3.构建2D部件
a.Model模块
用于描述现实世界可以被控制的,具有位置属性,具有父子关系的部件模型
-每个Model类型包含一个Drawing对象,此Drawing对象用于描述Model类型本身外观呈现信息
-每个Model类型包含一个指向Parent指针,多个指向Child指针,这样可以描述模型本身的父子关系,一父多子,多层嵌套
举个例子:
我们以一个方块描述汽车实体.
我们以4个圆描述汽车的4个轮子.
汽车实体可以直线运动,4个轮子可以旋转运动.
汽车实体和4个轮子首先分别属于独立Model
由于
汽车实体直线运动时,会带动4个轮子跟随其直线运动.
4个轮子旋转运动时,不会带动汽车实体的运动.
我们用父子关系可以描述出这种情况下的模型构建.
汽车实体Model是4个轮子Model的Parent.
4个轮子是汽车实体Model的Child.
-每个Model类型包含Position,用以描述每个可控制Model的实时位置,运动类型
-每个Model类型包含一个Transform.这样可以让我们在对由对个Model构成的复合场景建模的时候,
对每个Model以其自身为中心建模,
然后通过对每个Model施加以变换,
将多个独立建模的Model的坐标显示归一到统一的建模坐标系下,
呈现上,表现为初始呈现时,各个Model相互见的位置关系可以和实际情况保持一致.
4.参数管理
a.Parameter模块
为了完成对特定类型部件的建模我们需要设置部件参数,模型参数
为了完成动画驱动,我们需要生成一个控制部件运动的指令文件,
指令文件的生成需依据的一系列参数,包括参与运动与显示的各个部件及其模型信息,运动本身的信息
用一个独立的模块,来对部件建模,指令文件生成所需的参数进行类型化和管理
5.文件生成
a.FileGenerate模块
2D部件模型用xaml格式存储于模型文件中,
指令文件以我们定义的形式以nc格式存储于指令文件中,
用一个独立的模块,来对2D模型文件生成,控制动画过程的指令文件生成进行管理
6.文件解析
a.FileParse模块
我们需要读取xaml格式的模型文件,提取其中的信息,来完成部件模型对象在内存中的构建
我们需要解析nc格式的指令文件,依据其中的信息,源源不断的生成NCCODE指令,来作为我们动画驱动模块的初始出入,以完整整个动画驱动部分.
用一个独立的模块,来完成xaml模型文件解析,nc文件解析.
7.动画驱动
a.AnimationService模块
动画驱动的过程如下,
依据运动任务类型和模型信息生成由控制指令构成的NC文件
AnimationService提供启动动画的接口
执行过程如下:
ParseNcThread线程负责解析NC文件得到NCCODE指令,放入队列缓冲区
InterpolateNcCodeThread线程作为消费者取NCCODE指令,对其进行插补处理,得到NCSTEP,放入队列缓冲区
ProcessNcStepThread线程作为消费者取NCSTEP指令,将一个或多个NCSTEP指令合成为一个NCSHOW指令,放入队列缓冲区
主线程[界面线程]启动一个定时器,在处于动画运行状态时,每隔20ms,作为消费者取一条NCSHOW指令,进行界面显示
备注:
目前实现多线程间共享与同步,用的是信号量+互斥锁,
后续也许可以考虑全部替换为更简单直接的互斥量+条件变量来代替.
b.Sync模块
本模块的fixbufferfor1p1c实现了一个固定容量的一个消费者一个生产者的队列
8.指令体系
a.NcCode模块
目前支持的NCCODE有
提示指令,如
Tip={ Value="将删除元素移出数组"; }
部件移动指定,如
Move={ Type=1; MoveObjs={ Name="1", Id=7, Pos=200.000000,PosWay=1; } }
颜色控制指令,如
Color={ Name="1", Id=7, Value=(153,153,153,255);}
b.NcStep模块
描述插补后的NCCODE
c.NcShow模块
描述可直接用于界面呈现和处理的指令
9.应用模块--App
a.Application模块
包含main函数,及应用主界面设置
b.Ui模块
集中包含了应用的Ui界面及界面功能实现.
c.Function模块
用于提供一些公共功能类,供应用使用.
1.基于C++/Qt实现
2.Linux
3.https://github.com/xubenhao/VisualAlgorithm/releases
下载[暂时只提供Linux平台运行版本]
4.暂时只对数组做了完整的可视化实现.后续可扩展到其他数据结构和算法以构成一个完备的软件.