gpt4 book ai didi

javascript - d3.js 力有向图球体

转载 作者:行者123 更新时间:2023-11-29 14:44:15 26 4
gpt4 key购买 nike

我已经改编了Christopher Manning's force-directed graph on a sphere .我想让图表稳定下来,然后在不改变图表中各点之间关系的情况下旋转球体。相反,当我拖动时,它似乎在拖动图形,而不是旋转球体。拖动图形激活强制启动。如果我关闭 force.start() 什么都不会改变。

var svg = d3.select("#cluster").append("svg")
.attr("width", width)
.attr("height", height)
.call(d3.behavior.drag()
.origin(function() { var r = projection.rotate(); return {x: 2 * r[0], y: -2 * r[1]}; })
.on("drag", function() { force.start(); var r = [d3.event.x / 2, -d3.event.y / 2, projection.rotate()[2]]; t0 = Date.now(); origin = r; projection.rotate(r); }))

来自 http://bl.ocks.org/mbostock/3795040 ,我发现我可以旋转标线,但随后我所有的链接和节点都消失了。

var path = d3.geo.path()
.projection(projection);

var λ = d3.scale.linear()
.domain([0, width])
.range([-180, 180]);

var φ = d3.scale.linear()
.domain([0, height])
.range([90, -90]);

var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);

svg.on("mousemove", function() {
var p = d3.mouse(this);
projection.rotate([λ(p[0]), φ(p[1])]);
svg.selectAll("path").attr("d", path);
});

链接和节点是这样添加的:

  var link = svg.selectAll("path.link")
.data(graph.links)
.enter().append("path").attr("class", "link")
.attr ("stroke-width", function(d){return d.value/3});

var node = svg.selectAll("path.node")
.data(graph.nodes)
.enter()
.append("g")
.attr("class", "gnode")
.attr("text-anchor", "middle")

.append("path").attr("class", "node")
.style("fill", function(d) { return d.color; })
.style("stroke", function(d) { return d3.rgb(fill(d.group)).darker(); })

我想完成的事情:当图表就位后,我想使用拖动手势来旋转球体及其上的节点和链接。

我怎样才能做到这一点?

最佳答案

这可以通过调整为第一个代码段中定义的 svg 上的 drag 事件注册的处理程序来完成。这需要两次编辑:

  1. 摆脱 force.start(),因为您不想在拖动时重新启动力。
  2. 在投影更新后触发节点和链接的渲染,这可以通过调用 tick() 轻松完成。如果力没有被步骤 1 停用,这将被重复调用,因为该函数被注册为力布局的 tick 事件的处理程序。现在,您已经停用了强制,您将不得不明确地调用它。

重新格式化后的代码如下所示:

.on("drag", function() { 
//force.start(); // 1. Don't restart the force.
var r = [d3.event.x / 2, -d3.event.y / 2, projection.rotate()[2]];
t0 = Date.now();
origin = r;
projection.rotate(r);
tick(); // 2. Trigger the rendering after adjusting the projection.
}))

看看这个working example .

关于javascript - d3.js 力有向图球体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34550792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com