在添加新节点时阻止节点重叠

时间:2016-09-10 07:40:20

标签: cytoscape.js

如何防止在cytoscape js图中重叠新添加的节点? 我不想改变现有节点的位置 我希望新的添加节点通过此规则自动定位,以防止现有节点重叠

当我使用添加API将节点添加到图表时添加的节点重叠其他节点 我怎么能改变这种行为? 是否存在一种在添加模式下防止节点重叠的解决方案(新节点不与现有节点重叠)?

In [24]: A = np.random.randint(0,9,(10,10,10))
    ...: B = np.random.randint(0,9,(10,10,10,10,10))
    ...: 

In [25]: C1 = np.einsum('ijk,lmkno->ljmikno',A,B)

In [26]: C2 = A.transpose(1,0,2)[:,None,...,None,None]*B[:,None,:,None]

In [27]: np.allclose(C1,C2)
Out[27]: True

In [28]: %timeit np.einsum('ijk,lmkno->ljmikno',A,B)
10 loops, best of 3: 102 ms per loop

In [29]: %timeit A.transpose(1,0,2)[:,None,...,None,None]*B[:,None,:,None]
10 loops, best of 3: 78.4 ms per loop

In [30]: A = np.random.randint(0,9,(15,15,15))
    ...: B = np.random.randint(0,9,(15,15,15,15,15))
    ...: 

In [31]: %timeit np.einsum('ijk,lmkno->ljmikno',A,B)
1 loop, best of 3: 1.76 s per loop

In [32]: %timeit A.transpose(1,0,2)[:,None,...,None,None]*B[:,None,:,None]
1 loop, best of 3: 1.36 s per loop

2 个答案:

答案 0 :(得分:0)

没有内置的解决方案。我只是使用这段代码来测试一个空位来测试重叠(给定一个固定的节点大小,你可以调整它以使用边界框,但这会减慢速度)。

  function overlap(pos, size) {
  var overlap = false;
  cy.nodes(':visible').forEach(function (node) {
    var npos = node.position();
    if ((pos.x - size) < npos.x && (pos.x + size) > npos.x && (pos.y - size) < npos.y && (pos.y + size) > npos.y) {
      overlap = true;
      return false; //break
     }
  });
  return overlap;
}

我使用首选参数作为第一个参数({x:..,y:..}),当失败时我只需将y加10来查看它是否合适。这是最好的解决方案取决于具体问题。

答案 1 :(得分:0)

如果你想要一种自动化的方式,你最好的选择是力导向/物理布局。

运行布局时锁定除新节点外的所有节点。

您必须尝试使用​​不同的布局,以确定哪种布局最适合您的应用/数据。