[笔记] Node-Link可视化图中移动Node后自动布局调整算法

Node-Link可视化图中移动Node后自动布局调整算法

如果按工程来说,HyperGraph的可视化,用Node-Link可以说已经比成熟了,不论是D3.js还是各种其他JavaScript库诸如sigma.js等。不过大部分的库还是SVG的,可能一方面是SVG比较方便绑定事件,另一方面SVG也便于定义CSS去扩展样式。基于Canvas的实现也不少,感觉目前比较好看点的是GoJS,虽然free但是不是那么开源的至少js文件uglify过,开源的很好的是VIS.js。不过最喜欢的还是TensorFlow的可视化,每个block可以收缩和展开:

后面自己想用一个超图可视化的工具去管理自己的事情,于是就冲动是魔鬼地自己写起来。目前的实现还不是特别完整,先放出来后面有时间慢慢打磨。

https://github.com/dna2github/dna2petal/blob/master/codon/petal-codon.js


设计

在功能上,Codon是想有block container的收缩和展开功能的,这个牵涉到图的操作,作为一个基础lib,就暂时不管了。只要想办法做到,如果一个container被收缩(内部节点和相关边从可视列表删除)或者被展开(内部节点和相关边加入可视列表),那么这个container相应的大小需要自己调整,为了让节点都可以容易被操作,它们不应该堆叠起来,就是要做到像Force Layout那样。当移动一个节点以后,如果节点间有堆叠,需要重新计算整个layout。当然,可视化里的Zoom和Pan也是必要的。还有一个功能就是自动对可视对象进行排序,这样才能更好的展现节点间的关系(比如上图hello和world节点相连,world节点是container节点的子节点,如果hello和world相连的边在绘画时排序不当被container遮盖住,就会让人以为是hello和container相连了)。

实现

Zoom和Pan的话在代码里还未实现,但是canvas context 2d里有scale和translate函数,还是比较方便的,到时候paint前save,后restore,掌握好节奏就没有问题。

绘画时的排序也不难,拓扑排序,有了parent-children关系,先画parent,然后画和children相关的边,最后画children就可以了。

节点移动后layout调整,如果不考虑效率,还是容易的。

下面就详细说一说layout的调整。

初始化时有7个节点A B C D E F G,其中B C是A的子节点,F G是E的子节点。

当移动C以后,因为C是A的子节点,所以A要能显示出包含C,那么就要重新计算A的框。

下面就是在C的那一层进行冲突判断,因为C移动后,和A的所有其他子节点没有位置冲突,所以B C完成layout。

然后跑到A这一层判断冲突,A可以看作是整个canvas的子节点,那么它和另外两个节点D E判断后,发现D和A有冲突。这时以A的矩形中心为圆心,连接D的中心,将D沿着连接后的射线远离A移动,用倍增距离的形式先搜索到最大的无冲突位置,然后再在区域内二分查找得到最小移动后的无冲突位置。

这时这一层A和C的layout完成,到E时发现和C有冲突,同样的,圆心还是A的中心,对F进行位置重计算。

完成E的位置重计算后,就是对D和E的子节点进行相应平移。D中没有子节点,E中有F和G,所以调整F和G的位置,F和G都没有子节点,不用recursive了。

最终得到了新的layout。

代码中给出的版本,二分搜索的最大次数计算还不是很好,如果节点多了,可能会有些节点被弹开的距离比较大。

时间: 2024-08-29 17:02:21

[笔记] Node-Link可视化图中移动Node后自动布局调整算法的相关文章

javascript实现有向无环图中任意两点最短路径的dijistra算法

有向无环图 一个无环的有向图称做有向无环图(directed acycline praph).简称DAG 图.DAG 图是一类较有向树更一般的特殊有向图, dijistra算法 摘自 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijk

【Java学习笔记之十一】Java中常用的8大排序算法详解总结

分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序.   // 排序原始数据 private static final int[] NUMBERS = {49, 38, 65, 97, 76, 13, 27, 78, 34, 12, 64, 5, 4, 62, 99, 98,

nodejs:cmd中输入node -v提示不是内部文件等

安装好nodejs后,很想熟悉一下是否安装好了,可通过cmd实验一番,打开cmd输入"node -v",按下enter,出现如图一提示 图1 解决方案如下: 1.打开"系统属性"面板如图2(打开系统面板按如下步骤:1.桌面鼠标右击"计算机",2.弹出提示框,点击"属性",3.打开"系统"面板,点击"高级系统设置"如图3,即可进入系统属性面板) 图2 图3 2.点击"环境变量&q

Cocos2d-x从入门到精通第五课《Cocos2d-x中的Node》

Cocos2d-x中的Node 视频教程地址:http://edu.csdn.net/course/detail/1342/20983?auto_start=1 一.什么是结点 在介绍Cocos2d-x的结点系统之前,我们需要首先做一些启蒙,什么是树? 定义:   一棵树(tree)是由n(n>0)个元素组成的有限集合,其中: (1)每个元素称为结点(node): (2)有一个特定的结点,称为根结点或根(root): (3)除根结点外,其余结点被分成m(m>=0)个互不相交的有限集合,而每个子

在 Chrome 开发者工具中调试 node.js

命令行工具 devtool ,它可以在 Chrome 的开发者工具中运行 Node.js 程序. 下面的记录显示了在一个 HTTP 服务器中设置断点的情况. 该工具基于 Electron 将 Node.js 和 Chromium 的功能融合在了一起.它的目的在于为调试.分析和开发 Node.js 应用程序提供一个简单的界面. 你可以使用 npm 来安装它: npm install -g devtool 在某种程度上,我们可以用它来作为 node shell 命令的替代品.例如,我们可以这样打开一

CentOS 6 中安装Node.js 4.0 版本或以上

如果想在CentOS 6 中安装Node.js >4.0,如果通过以往的方式安装: wget https://nodejs.org/dist/latest/node-v4.0.0.tar.xz tar zvxf node-v4.0.0.tar.xz cd node-v4.0.0 ./configure make && make install 会遇到报错提示: WARNING: C++ compiler too old, need g++ 4.8 or clang++ 3.4 (CX

Aspose.Words:如何添加另一个WORD文档中的Node对象

原文:Aspose.Words:如何添加另一个WORD文档中的Node对象 首先看一段代码,这段代码意图从docSource中获取第一个表格,并插入docTarget的末尾: 1 var table = (Table)docSource.GetChild(NodeType.Table, 0, true); 2 docTarget.FirstSection.Body.ChildNodes.Add(table); 这段代码会抛出异常:“The newChild was created from a

在 Windows系统中编译node.js 源代码

Node.js 在 Windows 下只能通过 Microsoft Visual Studio 编译,因此你需要首先安装 Visual Studio 或者免费的 Visual Studio Express .你还需要安装 Python 2 ( 2.5 以上的版本,但要小于 3.0 ) ,可以在 http://python.org/ 取得.安装完 Python 以后请确保在 PATH 环境变量中添加 python.exe 所在的目录,如果没有则需要手动在“系统属性”中添加. 一切准备好以后,打开命

在 Web 应用中创建 Node.js 应用程序

本分步指南将通过 Azure Web 应用帮助您启动并运行示例 Node.JS 应用程序.除 Node.JS 外,Azure Web 应用还支持其他语言,如 PHP..NET.Node.JS.Python.Ruby 等,本教程重点介绍了 Java(其他语言将遵循同样的流程).在本教程中完成的所有操作均符合 1元试用条件. 开始之前 运行本示例之前,请在本地安装以下必备组件: 下载并安装 git 下载并安装 Node.js 和 NPM 下载并安装 Azure CLI 2.0 如果没有 Azure