Jestem nowym użytkownikiem D3 i próbuję utworzyć interaktywną wizualizację sieci. Skopiowałem duże fragmenty przykładu this, ale zmieniłem zakrzywione linie na proste za pomocą "linii" SVG, a nie "ścieżek", a także skalowałem węzły zgodnie z danymi, które reprezentują. Problem polega na tym, że moje groty strzałek (utworzone za pomocą znaczników SVG) znajdują się na końcach linii. Ponieważ niektóre z węzłów są duże, strzałki są ukryte za nimi. Chciałbym, aby moje groty strzałek pokazały się na zewnętrznej krawędzi węzła, na który wskazują.Uzyskiwanie strzałek do punktu na zewnętrznej krawędzi węzła w D3
Oto jak tworzę znaczniki i linki:
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 + ")"; });
zauważyłem, że atrybut „reFX” określa, jak daleko od końca linii grot powinien pokazać się. Jak mogę to uzależnić od promienia węzła, na który wskazuje? Jeśli nie mogę tego zrobić, czy mogę zmienić punkty końcowe linii? Zgaduję, chciałbym zrobić w tej funkcji, która resetuje punkty końcowe linii, jak porusza się wszystko:
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 + ")";
});
}
Które podejście jest bardziej sensowne, a jak bym go wdrożyć?
[To pytanie] (http://stackoverflow.com/questions/16568313/arrows-on-links-in-d3js-force-layout/16568625) powinno pomóc. –