У меня есть граф, ориентированный на силу, и я реализовал автозаполнение, чтобы выделить узел. По сути, когда вы выбираете узел, он окрашивается в красный цвет. Теперь я хотел бы «увеличить масштаб» этого узла, то есть изменить мое окно на 400% от размера узла, и узел должен быть центрирован в нем.
Вот соответствующие примеры моего кода: (или вы можете напрямую перейти к jsFiddle, который я настроил.)
Сначала код, используемый для создания элемента svg
:
var w = 4000,
h = 3000;
var vis = d3.select("#mysvg")
.append("svg:svg")
.attr("width", "100%")
.attr("height", "100%")
.attr("id","svg")
.attr("pointer-events", "all")
.attr("viewBox","0 0 "+w+" "+h)
.attr("perserveAspectRatio","xMinYMid")
.append('svg:g')
.call(d3.behavior.zoom().on("zoom", redraw))
.append('svg:g');
Затем, в качестве примера, использовалась функция перерисовки направленного графа на «обычном» увеличении.
function redraw() {
trans=d3.event.translate;
scale=d3.event.scale;
vis.attr("transform",
"translate(" + trans + ")"
+ " scale(" + scale + ")");
}
Вот узлы моего графика:
vis.selectAll("g.node")
.data(nodes, function(d) {return d.id;})
.enter().append("g")
.append("circle")
.attr("id", function(d){return "circle-node-"+ d.id})
.attr("fill","white")
.attr("r","50px")
.attr("stroke", "black")
.attr("stroke-width","2px");
И, наконец, вот мой автозаполнение.
$(function() {
$( "#tags" ).autocomplete({
source: nodes; //...
select: function( event, ui){
// ...
vis.selectAll("#circle-node-"+ui.item.value)
.transition()
.attr("fill", "red")
}
})
});
Я старался писать как можно меньше кода, так что извините, если что-то забыл.
Обновление Вот jsFiddle, показывающий, где я сейчас.