Ответ 1
Спасибо Ларсу Коттоффу, я получил это, чтобы работать по совету другого вопроса! Сначала я переключился с использования линий на пути. Я не думаю, что я действительно должен был это сделать, но это упростило следовать другим примерам, на которые я смотрел, потому что они использовали пути.
Затем я добавил к моим узлам поле "радиус". Я просто сделал это, когда я установил атрибут радиуса, добавив его как фактическое поле, а не сразу возвращая значение:
var circle = svg.append("svg:g").selectAll("circle")
.data(force.nodes())
.enter().append("svg:circle")
.attr("r", function(d) {
if (d.logic != null) {
d.radius = 5;
} else {
d.radius = node_scale(d.classSize);
}
return d.radius;
Затем я редактировал функцию tick(), чтобы учитывать этот радиус. Это потребовало немного простой геометрии...
function tick(e) {
path.attr("d", function(d) {
// Total difference in x and y from source to target
diffX = d.target.x - d.source.x;
diffY = d.target.y - d.source.y;
// Length of path from center of source node to center of target node
pathLength = Math.sqrt((diffX * diffX) + (diffY * diffY));
// x and y distances from center to outside edge of target node
offsetX = (diffX * d.target.radius) / pathLength;
offsetY = (diffY * d.target.radius) / pathLength;
return "M" + d.source.x + "," + d.source.y + "L" + (d.target.x - offsetX) + "," + (d.target.y - offsetY);
});
В принципе, треугольник, образованный контуром, это общее изменение x (diffX), и полное изменение y (diffY) является аналогичным треугольником к тому, что сформирован сегментом пути внутри цели node (т.е. node), изменение x внутри цели node (offsetX), а y изменяется внутри цели node (offsetY). Это означает, что отношение целевого радиуса node к общей длине пути равно отношению offsetX к diffX и отношению offsetY к diffY.
Я также изменил значение refX
на 10 для стрелок. Я не уверен, почему это было необходимо, но теперь это работает!