Я пытаюсь отобразить передачу сигналов лиганд-рецептор между различными типами клеток, поэтому важно было бы использовать самопетли.
Я пытался изменить функцию forceNetwork этого пакета, чтобы она отображала самопетли без успеха. Я пробовал несколько решений ( D3 Force Layout Graph - Самосвязывающий узел ). Как я могу изменить часть ниже, чтобы позволить самостоятельные петли?
function tick() {
node.attr("transform", function(d) {
if(options.bounded){ // adds bounding box
d.x = Math.max(nodeSize(d), Math.min(width - nodeSize(d), d.x));
d.y = Math.max(nodeSize(d), Math.min(height - nodeSize(d), d.y));
}
return "translate(" + d.x + "," + d.y + ")"});
function idx(d, type) {
var linkWidthFunc = eval("(" + options.linkWidth + ")");
var a = d.target.x - d.source.x;
var b = d.target.y - d.source.y;
var c = Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));
if (type == "x1") return (d.source.x + ((nodeSize(d.source) * a) / c));
if (type == "y1") return (d.source.y + ((nodeSize(d.source) * b) / c));
if (options.arrows) {
if (type == "x2") return (d.target.x - ((((5 * linkWidthFunc(d)) + nodeSize(d.target)) * a) / c));
if (type == "y2") return (d.target.y - ((((5 * linkWidthFunc(d)) + nodeSize(d.target)) * b) / c));
} else {
if (type == "x2") return (d.target.x - ((nodeSize(d.target) * a) / c));
if (type == "y2") return (d.target.y - ((nodeSize(d.target) * b) / c));
}
}
link
.attr("x1", function(d) { return idx(d, "x1"); })
.attr("y1", function(d) { return idx(d, "y1"); })
.attr("x2", function(d) { return idx(d, "x2"); })
.attr("y2", function(d) { return idx(d, "y2"); });
}