Я столкнулся с подобными опасениями некоторое время назад. Решение, к которому я, наконец, пришел, — это небольшая библиотека js, которая отлично справилась с задачей, а именно Дракула.
Вот ссылка на библиотеку: https://github.com/strathausen/dracula
Учитывая ваши потребности, все, что вам нужно сделать, это что-то вроде:
var g = new Graph();
g.addEdge('author', 'create');
g.addEdge('author', 'reader');
g.addEdge('author', 'admin');
// add here the other edges.
var layouter = new Graph.Layout.Spring();
layouter.layout();
var renderer = new Graph.Renderer.Raphael('#canvas', g, 400, 300);
renderer.draw();
Для получения дополнительной информации я позволю вам бороться с документацией.
Надеюсь, поможет.
[ДОБАВЛЕНИЕ]
Я бы добавил, что, вообще говоря, вопрос отображения узлов и стрелок не имеет большого значения, использование svg делает его почти тривиальным. Но все усложняется, когда вы хотите организовать отображение узлов с помощью таких правил, как «попытаться минимизировать количество пересекающихся ребер», «отображать дочерние элементы ниже их родителя» и т. д., которые требуют сложной математики.
Я не думаю, что Дракула позволяет настраивать такие правила. Тем не менее, учитывая ваш комментарий, я думаю, что может быть не слишком сложный способ сделать макет похожим на вертикальное дерево, так как это ациклический граф (по крайней мере, так кажется). Но тогда вам придется пройти через создание собственной библиотеки для этого.
person
dader
schedule
02.01.2013