【问题标题】:Force positions of some nodes with CoSE Bilkent layout使用 CoSE Bilkent 布局强制一些节点的位置
【发布时间】:2016-02-24 16:10:34
【问题描述】:

我正在处理复合图。我知道父节点的位置(例如:地理坐标),我想布局子节点以最小化边缘的交叉点。孩子们的最终位置无关紧要,只要他们彼此靠近即可。

带有 Cytoscape.js 的 CoSE Bilkent 算法为我提供了正确的布局,但我想设置父节点的位置并将它们锁定到位。

我做了什么:

  1. this example 开始,但节点较少;
  2. 为每个组设置位置:
    1. 只有父级;
    2. 父级及其子级的坐标相同;
  3. 调整了部分布局选项;
  4. 尝试了 locked 属性,但没有成功

我得到的最好的是this

到目前为止,组的相对位置是正确的,但如果我添加一个新组g5 我得到this

想要的结果是这样的:

如果需要,我愿意使用其他库。

【问题讨论】:

    标签: javascript cytoscape.js


    【解决方案1】:

    (1) 父级的位置和尺寸隐含在其子级的位置和尺寸中。

    (2) 您可以在图的子集上运行布局(例如,仅限子图):http://js.cytoscape.org/#collection/layout

    (3) 以高效的方式避免布局中的边缘相互重叠是一个活跃的、未解决的研究问题。此外,有些图表不是平面的。

    尝试使用 (2) 在每个父级后代的子图上运行布局:

    var topLvlParents = cy.nodes().orphans(':parent');
    
    topLvlParents.forEach(function( parent ){
      var descendants = parent.descendants();
      var edges = nodes.edgesWith( nodes );
    
      descendants.union( edges ).layout( someLayoutOptions );
    });
    

    您可以使用cose-bilkent 作为子图布局,并将位置调整为layoutstop 上所需的边界框(如果cose-bilkent 原生支持boundingBox,这会更容易)。或者你可以使用cose——它不像cose-bilkent那么复杂,但现在可以直接放置boundingBox

    如果您的复合父子层次结构只有一层,那么您也可以尝试在具有boundingBox 的子级上使用任何非复合布局。

    我的理解是 CoSE Bilkent 是最先进的复合节点布局算法。它来自一个专门研究图论、布局等的大学实验室。

    【讨论】:

      猜你喜欢
      • 2016-08-15
      • 2014-08-01
      • 1970-01-01
      • 2018-12-24
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      相关资源
      最近更新 更多