2
는 매우 비슷한 질문은 여기에 물어되었습니다 D3 force directed layout with bounding box ... 나는 제안 된 솔루션을하지만 성공하지 구현을 시도, 그래서 다시 물어 볼게요 :(D3 힘 지시 레이아웃 : 경계 상자
이 내 코드
입니다// initialization stuff happening up here...
// create graph:
this.onStateChange = function() {
svg.selectAll("g").remove();
nodes = {};
links = [];
links = eval(this.getState().string);
links.forEach(function(link) {
link.source = nodes[link.source] || (nodes[link.source] = {name : link.source});
link.target = nodes[link.target] || (nodes[link.target] = {name : link.target});
});
force.nodes(d3.values(nodes)).links(links).start();
path = svg.append("g").selectAll("path")
.data(force.links()).enter()
.append("path")
.attr("class", function(d) {return "link " + d.type;})
.attr("marker-end", function(d) {return "url(#" + d.type + ")";});
circle = svg.append("g").selectAll("circle")
.data(force.nodes())
.enter()
.append("circle")
.attr("r", 8)
.call(force.drag);
text = svg.append("g").selectAll("text")
.data(force.nodes())
.enter()
.append("text")
.style("font-size","15px")
.attr("x", 10)
.attr("y", ".42em").text(function(d) {return d.name;});
};
//add gravity
function tick() {
path.attr("d", linkArc);
circle.attr("transform", transform);
text.attr("transform", transform);
circle.attr("cx", function(d) { return d.x = Math.max(r, Math.min(w - r, d.x)); })
.attr("cy", function(d) { return d.y = Math.max(r, Math.min(h - r, d.y)); });
path.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
}
function linkArc(d) {
var dx = d.target.x - d.source.x,
dy = d.target.y - d.source.y,
dr = Math.sqrt(dx * dx + dy * dy);
return "M" + d.source.x + ","
+ d.source.y + "A" + dr + "," + dr
+ " 0 0,1 " + d.target.x + "," + d.target.y;
}
function transform(d) {
return "translate(" + d.x + "," + d.y + ")";
}
};
그러나이 나던 작업 - 더 이상 노드를 이동할 수 없습니다 그리고 그들은 오른쪽 상단 모서리에 갇혀있다
당신은 'tick()'을 강제 레이아웃의 틱 "이벤트에 대한 핸들러로 설정하지 않습니다. –
고마워, 나는 그것을 추가했다 : force.nodes (d3.values (nodes)). 링크 (links) .on ("tick", tick) .start(); ... 그러나 경계는 효과가없는 것처럼 보입니다. 노드가 상자 테두리 뒤를 돌아 다니고 있습니다. – SuperUser01
(저는 http://mbostock.github.io/d3/talk/20110921/bounding.html과 같은 것을 얻고 싶습니다) – SuperUser01