我有几个节点(例如应用程序名称)和一些带标签的边缘(例如信息流/系统接口及其信息对象)。我希望能够编写一个javascript脚本,以无重叠的方式绘制节点网格(例如信息流图),这意味着:
节点也需要放置的方式尽可能多的边缘线是可见的,而不是彼此混淆 - 因此需要进行某种优化。 还要求任何节点都可能连接到任何其他节点。
为了做到这一点,我正在寻找一个关于如何做到这一点(高级伪代码)或者随时可用的javascript实现的粗略想法。
我对以下内容不感兴趣,因为我知道它是如何工作的:
我开始使用类似的东西:
那样我就会有一棵树,我可以轻松地在我的画布上圆形展开。最初的想法是从那里做一些排序和分组。但是我很难将子树从网格结构中分组出来,不知何故卡在那里。
我也在想碰撞检测可能对我有所帮助。但是我没有说明如何帮助我放置节点,因此边缘在可见方面是最佳的。
为了使这里更加明显,输入数据结构如下:
%ALLOC()

答案 0 :(得分:1)
或者是一个随时可用的JavaScript实现
Springy.js可能适合您的需求......自从我上次使用它以来已经有一段时间了,但它有一个非常直接的API,所以它可能值得给它一试。一个例子:
var nodeseq = [ // id,name
{id:'i1',name:'app1'},
{id:'i2',name:'app2'},
{id:'i3',name:'app3'},
{id:'i4',name:'app4'},
];
var edgeseq = [ // id,sourcenodeid,targetnodeid,label
{id:'i1',sourcenodeid:'i1',targetnodeid:'i2',label:'Invoice'},
{id:'i2',sourcenodeid:'i1',targetnodeid:'i3',label:'Advise'},
{id:'i3',sourcenodeid:'i3',targetnodeid:'i3',label:'Test'},
{id:'i4',sourcenodeid:'i3',targetnodeid:'i4',label:'Test'},
{id:'i5',sourcenodeid:'i2',targetnodeid:'i3',label:'Test'},
];
var graph = new Springy.Graph();
var createNode = node => graph.newNode({label: node.name });
var nodeMap = makeMap("id", nodeseq, createNode);
// connect them with an edge
edgeseq.forEach(edge => graph.newEdge(
nodeMap[edge.sourcenodeid],
nodeMap[edge.targetnodeid],
{ label: edge.label }
));
$('canvas').springy({ graph: graph });
// Utils
function makeMap(prop, arr, t) {
t = t || (v => v);
return arr
.reduce((map, item) => Object.assign(map, {
[item[prop]] : t(item)
}), {});
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/springy/2.7.1/springyui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/springy/2.7.1/springy.min.js"></script>
<canvas width="400" height="200" />
&#13;