我想绘制一个由节点和边组成的图形,使用 Spring 布局算法(一种力导向布局) 一旦图形被布置好,我想让用户以交互方式添加新节点,并让布局演变,即定位新节点,同时保持以前的“形状”(不移动已经定位节点过多)。
我的意思是类似于 WordVis 在 http://www.wordvis.com 上所做的事情.
我目前正在使用 GraphDracula 中可用的 Spring 布局器图书馆。这是一个“简单”的,这意味着如果你重新布局图形,你可能会得到一个完全不同的布局(我认为这是由于算法中对 Math.rand
的调用)
做我想做的事情的算法/策略是什么?
我看到 graphdracula 的布局器将初始节点位置设置为零,然后迭代计算最终节点的位置。
假设我在 expandedNode
附近添加了一组节点 newNodes
:为了保持现有的形状,是否足以设置每个 newNodes< 的初始位置
到 expandedNode
之一,然后再次将力应用于所有节点?
您是否有任何指向一种算法的指针,该算法不仅可以对图形进行一次布局,还可以让您添加新节点重新布局整个图形,而无需过多更改绘图?
欢迎任何提示。
我目前正在使用 javascript,但语言并不重要。
最佳答案
你可以使用 Gephi为此:
- 导入您的图表
- 在布局面板中,使用 ForceAtlas 渲染您的图表,然后停止布局。
- 选择所有节点,右键单击并“确定”节点。他们不会移动。
- 添加新节点和链接。
- 再次运行相同的布局。
当然这不是一个完美的解决方案,但如果不添加太多连接图形不同区域的新节点,这个技巧会合理地工作。
关于java - 图布局 : re-layout preserving the shape of the drawing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9097232/