Я пытаюсь построить граф d3 (в настоящее время только несвязанные узлы) для обработки относительно небольших значений узлов. По этой причине я использую линейную шкалу, которая динамически реагирует на входных значений и масштабирует их соответственно:d3.js Странное поведение перетаскивания при использовании динамического масштабирования
var xScale = d3.scale.linear().range([0, width]);
var yScale = d3.scale.linear().range([height, 0]);
[...]
xScale.domain(d3.extent(layout, function (d){ return d.x; }));
yScale.domain(d3.extent(layout, function (d){ return d.y; }));
В текущей версии (вы можете найти его здесь: https://jsfiddle.net/mn1wmbe3/6/) перетягивания и значение изменение отдельных узлов работ прекрасно. Это код, я использую, чтобы переместить узел:
node.filter(function(d) { return d.selected; })
.each(function(d) {
d.x = xScale.invert(d3.event.x);
d.y = yScale.invert(d3.event.y);
})
.attr("cx", xScale(d.x))
.attr("cy", yScale(d.y));
Как видно из других примеров, чтобы иметь возможность переместить несколько узлов одновременно я должен был бы добавить относительные координаты движения сопротивления (d3.event.dx
) для каждого выбранное значение узла. Например:
node.filter(function(d) { return d.selected; })
.each(function(d) {
d.x += xScale.invert(d3.event.dx);
d.y += yScale.invert(d3.event.dy);
})
.attr("cx", xScale(d.x))
.attr("cy", yScale(d.y));
Однако, это ведет себя не так, как ожидалось, и перемещает узлы далеко. Вы можете увидеть это в действии here.
У вас есть предложения, почему это так? Есть ли возможность обойти это и переместить несколько узлов по-другому?