如何防止在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
答案 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)
如果你想要一种自动化的方式,你最好的选择是力导向/物理布局。
运行布局时锁定除新节点外的所有节点。
您必须尝试使用不同的布局,以确定哪种布局最适合您的应用/数据。