问题 D3.js中的包围框


我想很多与D3.js一起工作过的人已经经历过同样的事情:你的网络或你所采取的任何可移动元素如果被推到硬盘上,就会继续飞出svg-element。如果我的网络很大,外部节点就会消失,它们就会“落入世界的边缘”。

我非常害羞有一种方法可以使svg的边框成为一个坚固的“墙”,所以元素不能离开它并在空间中隐形飞行:)

你怎么处理这个问题?你是怎么解决的?

提前致谢,     大卫


9732
2017-11-21 08:09


起源



答案:


最后,如果您在网络上找到合适的网站,那将非常简单。 http://bl.ocks.org/1129492 完全符合我的要求 - 物品不能滑出svg。所以他只是在更新节点位置时添加了一些约束。 我的'tick'功能结束了

node.attr("cx", function(d) { return d.x = Math.max(15, Math.min(width - 15, d.x)); })
    .attr("cy", function(d) { return d.y = Math.max(15, Math.min(height - 15, d.y)); });

link.attr("x1", function(d) { return d.source.x; })
    .attr("y1", function(d) { return d.source.y; })
    .attr("x2", function(d) { return d.target.x; })
    .attr("y2", function(d) { return d.target.y; });

node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

每当重要的事情发生时,就会调用它,“滴答” - 东西是在D3.js内部深处建立的东西,所以不要问我这个问题。 :)

给定代码中的前两行和最后一行检查坐标是否开箱即用。

希望这可以帮助那里的人比我做得更快;)

玩的很开心,     戴夫


13
2018-01-23 14:02



谢谢@David ..非常有帮助的答案。我很多天都在搜索它。 - Jaydipsinh


答案:


最后,如果您在网络上找到合适的网站,那将非常简单。 http://bl.ocks.org/1129492 完全符合我的要求 - 物品不能滑出svg。所以他只是在更新节点位置时添加了一些约束。 我的'tick'功能结束了

node.attr("cx", function(d) { return d.x = Math.max(15, Math.min(width - 15, d.x)); })
    .attr("cy", function(d) { return d.y = Math.max(15, Math.min(height - 15, d.y)); });

link.attr("x1", function(d) { return d.source.x; })
    .attr("y1", function(d) { return d.source.y; })
    .attr("x2", function(d) { return d.target.x; })
    .attr("y2", function(d) { return d.target.y; });

node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

每当重要的事情发生时,就会调用它,“滴答” - 东西是在D3.js内部深处建立的东西,所以不要问我这个问题。 :)

给定代码中的前两行和最后一行检查坐标是否开箱即用。

希望这可以帮助那里的人比我做得更快;)

玩的很开心,     戴夫


13
2018-01-23 14:02



谢谢@David ..非常有帮助的答案。我很多天都在搜索它。 - Jaydipsinh


要使边界成为力导向图中的实体“墙”,您需要为边界框的边缘实现一些自定义碰撞检测。 这是自定义碰撞检测的示例

克里斯托弗的方法适用于小型图形,但对于比视口大得多的图形,它们将扩展到不可读的小尺寸。我在上面给出的方法也会在小视口中的大图上失败,因为碰撞在某些时候无法解决。

对于非常大的图形,我建议只需允许用户平移和缩小。 这篇SO帖子提供了一些关于缩放的提示。您还需要创建一个 rect 这是图表的大小,作为接收鼠标事件的目标。您可以动态调整大小,例如,强制定向图的大小 tick 事件处理程序

希望这些是一些有用的指针。


2
2017-11-22 14:33



'tick'是这里要提的,你可以看到我在tick函数中解决了问题,但没有任何缩放:) - David


修复远离您的图形可视化的一般方法是获取边界框,然后在SVG上创建一个转换,将边界框精确地映射到视口上(保持纵横比被限制为一些模糊的合理值)。

如果用户放大,则会忘记此过程。

结果是,如果“东西”飞走了,你会有效地看到它缩小。并且用户可以根据需要进行缩放。

让这种方法运作良好的关键是写下状态图。当某些内容触发重新计算时,您将进入“修复边界框”模式,当图形大多停止移动时,您将切换到“用户控制缩放”模式。让它运行良好意味着在状态之间进行正确的转换(始终为高级用户提供覆盖)。


0
2017-11-21 08:54



谢谢你的帮助!现在我找到了我想要的东西,它没有任何缩放功能。我觉得它要困难得多,但事实证明很容易控制坐标的变化而不是弹出开箱即用;) - David