LabVIEW_树容器

树中某个结点的子节点可以有多个,这就意味着,无论用哪种顺序将树中所有的结点存储到数组中,结点的存储位置都无法直接反映逻辑关系。所以简单的顺序存储是不能满足树的实现要求的。不过可以充分利用顺序存储和链式存储结构的特点,完全可以实现对树的存储结构的表示。

      之所以要提到树结构是在实际工作过程中遇到一种三维数据的拓扑关系建立问题,散乱点云进行去噪、平滑、重建等后续操作都需要建立点与点之间的拓扑关系,简单的拓扑划分就是根据点云的长宽高建立三维数组,点云是外轮廓点云,在这个建立的立方体结构中,大部分都是浪费的(点云只有外轮廓点,中空),建立大型数据结构时,非常浪费内存。如下图所示,大部分的立方体网格为空。

图片

比较好的解决方案就是,有数据的地方建立立方体网格,没有数据的地方不建立,高效的利用计算机内存。比较好的方法有KDTree和OcTree(八叉树)方法存储,比较直观表达三维数据结构存储的就是OcTree,其组织点云的存储方式如下:

图片

        LabVIEW语言本身没有树容器,如何建立通用型树容器,一样可以通过LVOOP和DVRs来实现。新建TreeNode类继承BasicSortedList类,用于双向链表操作。其数据包含父类、子类,节点类可以是任意数据类型,用LabVIEW最高父类来建立数值引用作为节点数值类型,建立过程如下:

图片

建立Tree类,封装树的属性及操作方法,建立过程入下:包换跟节点及有序链表类。

图片

LabVIEW树形数据容器数据存储如下图所示,openList是存储处理的链表

图片

子节点插入树

      根据数据引用计算在链表中的位置并插入链表,位置的计算不同的树结构计算方法也不一样,只要继承该方法就好,具体的算法在具体的子树类中设计(KDtree要计算是数据放在左节点还是右节点、OcTree是要计算放到哪个立方体内……)

图片

搜索数据

图片

逻辑如下:

1)根据节点插入到OpenList链表

2)在循环内部读出第一个节点

3)找到目标节点(不同的树类型,找的的方法不一样,只要继承该方法,具体的算法在子类中设计)

4)展开目标节点的子节点

5)将子节点插入到OpenList链表

6)循环下去直到找到目标节点。

        以上是典型通用型LabVIEW树容器的设计思想。这里有个算法比较耗时“找到目标节点”需要不停的迭代,直到找到才停止。如下图所示,依深度优先操作搜索,我要找到E,必须从根节点A->B->C->D->E,搜索路径需要这么长。

图片

       有没有不需要这么长的搜索路径就可以直接定位E的方法,LabVIEW Framework Engineer Chris Cilino&Cirrus Logic两位博士设计一种树容器并提供了方便的操作API。

如下图所示。

图片

简单DEMO

       创建Root跟节点,然后插入两个子对象010和011,然后搜索010对象,插入0100和0101两个子对象,用树形控件显示树形节点,最后销毁树形容器。

图片

       该API提供了创建节点、插入子节点、获取子节点、销毁树容器、获取容器的属性、类属性设置、类属性获取、删除属性等操作API,比较直观,符合LabVIEW的习惯编程逻辑,非常棒的一套工具,在以后的篇章中将用此工具讲解创建OcTree的详细过程,欢迎围观!

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/314166.html

(0)
联系我们
联系我们
分享本页
返回顶部