Obtener puntas de flecha para apuntar al borde exterior del nodo en D3

Soy nuevo en D3 y estoy tratando de crear una visualización de red interactiva. He copiado gran parte deesta ejemplo, pero he cambiado las líneas curvas a líneas rectas mediante el uso de "líneas" SVG en lugar de "rutas", y también he escalado los nodos de acuerdo con los datos que representan. El problema es que mis puntas de flecha (creadas con marcadores SVG) están al final de las líneas. Como algunos de los nodos son grandes, las flechas se ocultan detrás de ellos. Me gustaría que mis puntas de flecha aparezcan justo en el borde exterior del nodo al que apuntan.

Así es como estoy creando los marcadores y enlaces:

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

Noté que el atributo "refX" especifica qué tan lejos del final de la línea debería aparecer la punta de flecha. ¿Cómo puedo hacer que esto dependa del radio del nodo al que apunta? Si no puedo hacer eso, ¿podría cambiar los puntos finales de las líneas? Supongo que lo haría en esta función, que restablece los puntos finales de las líneas a medida que todo se mueve:

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

¿Qué enfoque tiene más sentido y cómo lo implementaría?

Respuestas a la pregunta(2)

Su respuesta a la pregunta