Нет необходимости определять пользовательские метки (это можно сделать с помощью пользовательских меток).
Положение объектов контролируется с помощью Stardust.scale()
.
var positions = Stardust.array("Vector2")
.value(d => [d.x, d.y])
.data(nodes);
var positionScale = Stardust.scale.custom("array(pos, value)")
.attr("pos", "Vector2Array", positions)
Поизменяя функцию value
, вы можете изменять масштаб и переводить.
Прикрепив зум к холсту, перетаскивание звездной пыли больше не работает.Но это другая проблема.
Я использовал пример https://stardustjs.github.io/examples/graph/
В обратном вызове масштабирования сохраните параметры масштабирования и запросите новый рендер графика.
var fps = new FPS();
var zoom_scale = 1.0, zoom_t_x = 0.0, zoom_t_y = 0.0;
d3.select(canvas).call(d3.zoom().on("zoom", zoomed));
function zoomed() {
zoom_scale = d3.event.transform.k;
zoom_t_x = d3.event.transform.x;
zoom_t_y = d3.event.transform.y;
requestRender();
}
function render() {
positions.value(d => [d.x*zoom_scale + zoom_t_x, d.y*zoom_scale + zoom_t_y]);
......
}
В примере содержится ошибка.
При использовании ползунка моделирование никогда не останавливается, поскольку alphaTarget
установлено на 0,3.
force.alphaTarget(0.3).restart();
Его следует изменить на
force.alpha(0.3).alphaTarget(0).restart();