Holen Sie sich Pfeilspitzen-zu-Punkt an der äußeren Kante von Knoten in D3

Ich bin neu in D3 und ich bin versucht, zu erstellen eine interaktive Netzwerk-Visualisierung. Ich habe kopiert große Teile der diese Beispiel, aber ich habe geändert, die gekrümmten Linien gerade durch die Verwendung von SVG - "Linien" statt "wegen", und ich habe auch skaliert den Knoten entsprechend den Daten, die Sie darstellen. Das problem ist, dass meine Pfeilspitzen (erstellt mit SVG-Markierungen) sind an den enden der Linien. Da einige der Knoten sind groß, die Pfeile bekommen sich hinter Ihnen verbirgt. Ich möchte meine Pfeilspitzen zu zeigen, bis direkt an den Rand des Knoten Sie zeigen.

Hier ist, wie ich bin, das erstellen der Marker und links:

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 + ")"; });

Bemerkte ich, dass die "refX" - Attribut gibt an, wie weit vom Ende der Linie, die der Pfeil sollte nach oben zeigen. Wie kann ich diese abhängig vom radius des Knotens es ist zu zeigen? Wenn ich es nicht hätte, würde ich stattdessen ändern Sie die Endpunkte der Linien auf sich? Ich vermute, ich würde das nicht in dieser Funktion, die setzt die Endpunkte der Linien als alles, was sich bewegt:

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 + ")";
        });
    }

Welches Konzept macht mehr Sinn, und wie sollte ich das umsetzen?

InformationsquelleAutor FrancesKR | 2013-05-21
Schreibe einen Kommentar