2013-11-20 37 views
1

我正在使用带有小负值的力布局来避免将SVG元素放在彼此之上。但是,我需要将这些项目保留在其原始位置的〜20px范围内。有没有办法限制物品移动的总净X/Y距离?D3 Force布局的最大距离限制?

每个SVG元素代表一个公共汽车站,所以重要的是物品不要重叠,但也不要离开原来的位置太远。

回答

3

有一个在力布局本身对这个没办法,但你可以做到这一点很容易自己在处理该tick事件功能:

force.on("tick", function() { 
    nodes.attr("transform", function(d) { 
    return "translate(" + Math.min(0, d.x) + "," + Math.min(0, d.y) + ")"; 
    }); 
}); 

这将绑定的位置是右上方(0,0)。你显然可以修改它以任何其他方式进行绑定(可能使用嵌套的Math.min/Math.max)。你甚至可以通过存储允许的位置范围与元素并引用它来动态地做到这一点。

查看here查看here的示例,该示例使用此技术来限制使用强制布局浮动的标签位置。

+0

有趣的 - 我应该在我的问题更具体。在我的实现中,不是移动SVG中包含的形状,而是使用CSS顶部和左侧偏移来移动(小)SVG容器本身。虽然我可能会将最重要的变化设置为Math.min(item.top,item.top + 5),但是不会将相同的项目都转移到相同的界限? – arami

+0

不确定你的意思 - 你肯定可以用这种方法做的是记录原始位置,并限制任何力量指向运动在20x20框内。 –