xubenhao / VisualAlgorithm

1.算法可视化.[暂时只对数组做了完整的可视化支持,后续扩展到其他数据结构和算法].2.一个完整的2D建模和渲染系统的实现.[2D建模目前的基础图元支持点/线/矩形/椭圆/多段线,但易于添加对其他基础图元的支持]3.一个完整的动画驱动引擎[包含动画指令文件生成,指令文件解析,指令插补,定时界面绘制的多线程流水线实现]

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

VisualAlgorithm

软件运行界面&及功能展示

具体信息见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.暂时只对数组做了完整的可视化实现.后续可扩展到其他数据结构和算法以构成一个完备的软件.

About

1.算法可视化.[暂时只对数组做了完整的可视化支持,后续扩展到其他数据结构和算法].2.一个完整的2D建模和渲染系统的实现.[2D建模目前的基础图元支持点/线/矩形/椭圆/多段线,但易于添加对其他基础图元的支持]3.一个完整的动画驱动引擎[包含动画指令文件生成,指令文件解析,指令插补,定时界面绘制的多线程流水线实现]

License:Apache License 2.0


Languages

Language:C++ 97.5%Language:QMake 1.6%Language:C 0.9%