Я хотел бы визуализировать ориентированный граф, используя алгоритм принудительной компоновки из d3. Узлы должны отображаться в виде их имен внутри прямоугольника вот так. Моя проблема состоит в том, чтобы вычислить положение за пределами прямоугольника, на которое должны указывать стрелки.
Я думаю, что это должно быть сделано внутри функции tick(). Чтобы избежать чрезмерных усилий, таких как расчеты углов, я мог бы использовать теорему о перехвате.
Я не знаю, как получить параметры ребер, которые будут заданы с помощью атрибутов, и я не смог найти пример для этого.
var force = d3.layout.force().nodes(dataset.nodes).links(dataset.edges)...
var edges = svg.selectAll("line").data(dataset.edges).enter().append("line")...
var nodes = svg.selectAll("text").data(dataset.nodes).enter().append("text")...
force.on("tick", function(){
// Why does the following function not work? How to implement this correctly?
edges.attr(function(d){
var x1 = d.source.x
var y1 = d.source.y
var x2 = d.target.x
var y2 = d.target.y
// ... calulate new source and targetcoordinates ... I can do this myself
return {
"x1": newSourceX,
"y1": newSourceY,
"x2": newTargetX,
"y2": newTargetY
}
});
});
Как реализовать функцию для каждого края, чтобы извлечь любой исходный и целевой параметр и сохранить новые позиции?
Как вы думаете, это лучшее решение?