D3 は初めてで、インタラクティブなネットワーク ビジュアライゼーションを作成しようとしています。この例の大部分をコピーしましたが、「パス」ではなく SVG の「線」を使用して曲線を直線に変更し、ノードが表すデータに従ってノードをスケーリングしました。問題は、私の矢印 (SVG マーカーで作成) が行末にあることです。一部のノードは大きいため、矢印はそれらの後ろに隠れます。矢印が指しているノードの外側の端に矢印が表示されるようにしたいと思います。
マーカーとリンクを作成する方法は次のとおりです。
svg.append("svg:defs").selectAll("marker")
.data(["prereq", "coreq"])
.enter().append("svg:marker")
.attr("id", String)
.attr("viewBox", "0 -5 10 10")
.attr("refX", 15)
.attr("markerWidth", 6)
.attr("markerHeight", 6)
.attr("orient", "auto")
.append("svg:path")
.attr("d", "M0,-5L10,0L0,5");
var link = svg.selectAll(".link")
.data(force.links())
.enter().append("line")
.attr("class", "link")
.attr("marker-end", function(d) { return "url(#" + d.type + ")"; });
「refX」属性が、行末から矢印を表示する距離を指定していることに気付きました。これを指しているノードの半径に依存させるにはどうすればよいですか? それができない場合は、代わりに線自体の端点を変更できますか? すべてが移動するときに線の端点をリセットするこの関数でそれを行うと思います:
function tick() {
link
.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; });
circle.attr("transform", function(d) {
return "translate(" + d.x + "," + d.y + ")";
});
text.attr("transform", function(d) {
return "translate(" + d.x + "," + d.y + ")";
});
}
どちらのアプローチがより理にかなっており、どのように実装すればよいでしょうか?